6

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

除了我试图匹配("2,5")("2,4,5"). 显然字符串不相等,但我需要返回该匹配项,因为它具有第一个 CDL 中的所有值。

我的 SQL Fiddle 应该说得很清楚......

任何帮助将非常感激。

哦,我看到这个相似的,但这似乎有点激烈,而且我头晕目眩,但我会看看我是否可以尝试理解它。

编辑
所以我只是做了一个替换更改("2,5")("%2%5%")并更改了要使用的LIKE. 从我最初可以看出它似乎正在工作.. SQL Fiddle我不应该这样做的任何原因,或者我可能很疯狂并且它根本不起作用?

4

2 回答 2

2

更进一步,离你的答案更近一步。
SQL 小提琴演示


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
于 2013-03-29T01:57:10.303 回答
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
于 2013-03-28T22:55:39.417 回答