admin

字符串拆分SQL函数仅返回字符串中的第一个单词

sql

我有一个功能:

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行

有人可以帮忙吗?


阅读 160

收藏
2021-06-07

共1个答案

admin

您的函数正在返回Andy前面的空白。

您应该使用LTRIMfunction将其删除。在插入@tbl时都可以使用:

 INSERT @tbl (string)
         VALUES (LTRIM (substring(@list, @pos + 1, @valuelen)))

或当您调用函数时:

SELECT LTRIM(string) FROM [dbo].[func_ParseString] ('Dan, Andy')
2021-06-07