Сравнение строк с разделителями-запятыми в 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