Сравнение строк с разделителями-запятыми в SQL

у меня есть поисковые запросы, которые приходят в CDL ("1,2,3,4"),("1,5"). Мне нужно сравнить это с другим CDL и вернуть все записи, которые имеют совпадение. Кикер-это позиция каждого числа не всегда одинакова.

у меня есть что-то почти работать, за исключением случаев, когда я пытаюсь соответствовать ("2,5") to ("2,4,5"). Очевидно, что строки не равны, но мне нужно вернуть это совпадение, потому что у него есть все значения в первом CDL.

моя скрипка SQL должно быть достаточно ясно...

любая помощь была бы очень признательна.

О, и я видел это один похоже, но это кажется немного резким и над моей головой, но я посмотрю, смогу ли я попытаться понять это.

редактировать
Поэтому я просто сделал замену, чтобы изменить ("2,5") to ("%2%5%") и изменил were использовать LIKE. Судя по тому, что я могу сказать, это работает.. SQL Fiddle любая причина I не стоит этого делать или, может быть, я сумасшедший, и это вообще не работает?

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

вы можете преобразовать списки в таблицу со следующей функцией:

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