我有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任何理由我不应该这样做,或者我疯了,它根本不起作用?
答案 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