【问题标题】:Compare comma delimited strings in SQL比较 SQL 中的逗号分隔字符串
【发布时间】:2013-03-29 09:57:10
【问题描述】:

我有来自 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 有什么理由我不应该这样做,或者我疯了而且它根本不起作用?

【问题讨论】:

  • 如果您可以生成统一的 CDL 可能会更容易(看不到小提琴,所以也许我的评论完全无关紧要)。

标签: sql database sql-server-2008 tsql varchar


【解决方案1】:

再往前走一步,就离你的答案更近了。
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

【讨论】:

  • 很好,这基本上就是我在“编辑”中所做的。现在我只希望表现不会太糟糕。 CSV 不应该超过 20,所以我必须测试并查看。谢谢!
【解决方案2】:

您可以使用以下函数将列表转换为表格:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多