我有一个功能:
ALTER FUNCTION [dbo].[func_ParseString] (@list nvarchar(MAX)) RETURNS @tbl TABLE (string VARCHAR(500) NOT NULL) AS BEGIN DECLARE @pos int, @nextpos int, @valuelen int SELECT @pos = 0, @nextpos = 1 WHILE @nextpos > 0 BEGIN SELECT @nextpos = charindex(', ', @list, @pos + 1) SELECT @valuelen = CASE WHEN @nextpos > 0 THEN @nextpos ELSE len(@list) + 1 END - @pos - 1 INSERT @tbl (string) VALUES (substring(@list, @pos + 1, @valuelen)) SELECT @pos = @nextpos END RETURN END
我有桌子
id --- name --- age 1 --- Dan --- 20 2 --- Chris --- 30 3 --- Andy --- 20
当我尝试执行select in语句时,它仅返回逗号分隔字符串中名字的所有值
SELECT * FROM table WHERE name IN (SELECT string COLLATE DATABASE_DEFAULT FROM [dbo].[func_ParseString]('Dan, Andy')
仅在我要返回第1行和第3行时才返回第1行
有人可以帮忙吗?
您的函数正在返回Andy前面的空白。
您应该使用LTRIMfunction将其删除。在插入@tbl时都可以使用:
LTRIM
INSERT @tbl (string) VALUES (LTRIM (substring(@list, @pos + 1, @valuelen)))
或当您调用函数时:
SELECT LTRIM(string) FROM [dbo].[func_ParseString] ('Dan, Andy')