2013-03-28 41 views
6

我有搜索請求來自CDL ("1,2,3,4"),("1,5")。我需要將其與另一個CDL進行比較並返回所有匹配的記錄。踢球者每個號碼的位置並不總是相同的。在SQL中比較逗號分隔的字符串

我已經有一些工作幾乎工作,除了我試圖匹配("2,5")("2,4,5")的實例。很顯然,這些字符串並不相同,但我需要返回該匹配,因爲它具有第一個CDL中的所有值。

My SQL Fiddle should make it fairly clear...

任何幫助將非常感激。

哦,我看到這個one是相似的,但這似乎有點激烈,在我的頭上,但我會看看我是否可以試着去理解它。

編輯
所以,我只是做了更換,以改變("2,5")("%2%5%")和改變是使用LIKE。從我最初可以告訴它似乎工作.. SQL Fiddle任何理由我不應該這樣做,或者我是瘋了,它根本不工作?

+0

也許會更容易些,如果你能生成均勻CDL代替(不能看到小提琴,所以也許我的意見是完全無關)。 – didierc

回答

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 
+0

不錯,基本上就是我在「編輯」中所做的。現在我只希望表現並不糟糕。 CSV的數量不應超過20個,所以我必須測試並查看。謝謝! – EmptyChair

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