比较SQL中的逗号分隔字符串

时间:2013-03-28 22:31:21

标签: sql database sql-server-2008 tsql varchar

我有CDL ("1,2,3,4")("1,5")中的搜索请求。我需要将它与另一个CDL进行比较并返回所有匹配的记录。踢球者是每个数字的位置并不总是相同。

除了我尝试将("2,5")("2,4,5")匹配的情况外,我的工作几乎正常。显然字符串不相等但我需要返回该匹配,因为它具有第一个CDL中的所有值。

My SQL Fiddle should make it fairly clear...

非常感谢任何帮助。

哦,我看到这个one是相似的,但这似乎有点激烈,但我会看到我是否可以尝试理解它。

修改
所以我只是进行了替换,将("2,5")更改为("%2%5%"),并将其更改为使用LIKE。从我最初可以说它似乎工作.. SQL Fiddle任何理由我不应该这样做,或者我疯了,它根本不起作用?

2 个答案:

答案 0 :(得分:2)

更进一步,接近你的答案。
SQL FIDDLE DEMO


SELECT P.* 
FROM Product P
CROSS APPLY(
  SELECT *
  FROM ShelfSearch SS
  WHERE Patindex(char(37)+replace(ss.shelflist, ',',char(37))+char(37),p.shelflist) > 0
)Shelfs

答案 1 :(得分:0)

您可以使用以下功能将列表转换为表格:

CREATE FUNCTION DelimitedStringToTable (@cdl varchar(8000), @delimiter varchar(1))
RETURNS @list table (
    Token varchar(1000)
)
AS
BEGIN

DECLARE @token varchar(1000)
DECLARE @position int

SET @cdl = @cdl + @delimiter -- tack on delimiter to end 
SET @position = CHARINDEX(@delimiter, @cdl, 1)
    WHILE @position > 0
        BEGIN
            SET @token = LEFT(@cdl, @position - 1)
            INSERT INTO @list (Token) VALUES (@token)
            SET @cdl = RIGHT(@cdl, DATALENGTH(@cdl) - @position)        
            SET @position = CHARINDEX(@delimiter, @cdl, 1)      
        END 
    RETURN
END

然后你可以用这样的东西找到所有的比赛:

SELECT list1.* 
FROM DelimitedStringToTable('1,2,3', ',') list1
INNER JOIN DelimitedStringToTable('2', ',') list2 ON list1.Token = list2.Token