Sql 在逗号分隔的值中查找包含相同值的行

Sql 在逗号分隔的值中查找包含相同值的行,sql,sql-server,csv,sql-server-2014,Sql,Sql Server,Csv,Sql Server 2014,我有一个varchar列,由另一个我无法控制的进程填充,该列由逗号分隔的值填充 现在,我需要找到该列的一部分存在于同一列中的所有行,在另一行中 范例 declare @table table (value varchar(50)) insert into @table values ('NB,BD,FR'), ('BD,GK'), ('SL,SR') select * from @table 所以这个表包含 value ----- NB,BD,FR BD,GK SL

我有一个varchar列,由另一个我无法控制的进程填充,该列由逗号分隔的值填充

现在,我需要找到该列的一部分存在于同一列中的所有行,在另一行中

范例

declare @table table (value varchar(50))
insert into @table values ('NB,BD,FR'), ('BD,GK'), ('SL,SR')

select * from @table
所以这个表包含

value   
-----   
NB,BD,FR    
BD,GK   
SL,SR   
从上面的例子中,我想得到

value   
-----   
NB,BD,FR    
BD,GK   
因为在本例中有一个值BD,但可以是两行中的任何内容


这可以在sql中完成吗?

这是错误的数据结构。不要在字符串中存储值

declare @table table (id int, value varchar(50));
insert into @table
    values (1, 'NB'), (1, 'BD'), (1, 'FR'),
           (2, 'BD'), (2, 'GK'),
           (3, 'SL'), (3, 'SR');
然后,您可以使用窗口函数获取所需内容:

 select id, value
 from (select t.*, max(cnt) over (partition by id) as max_cnt
       from (select t.*, count(*) over (partition by value) as cnt
             from @table t
            ) t
      ) t
 where max_cnt >= 2

可以使用笨拙的XML操作将逗号分隔的值转换为行:

DECLARE @table TABLE (value VARCHAR(50));
INSERT INTO @table VALUES
('NB,BD,FR'),
('BD,GK'),
('SL,SR');

WITH cte AS (
    SELECT value, node.value('.', 'varchar(10)') AS substr
    FROM @table
    CROSS APPLY (SELECT CAST('<x>' + REPLACE(value, ',', '</x>,<x>') + '</x>' AS XML)) AS x(doc)
    CROSS APPLY doc.nodes('/x') AS n(node)
)
-- use your favorite technique to find the duplicate
SELECT value
FROM cte AS m
WHERE EXISTS (
    SELECT 1
    FROM cte AS x
    WHERE value <> m.value AND substr = m.substr
)

演员阵容。。。作为XML部分,假设您的数据不包含在XML中具有特殊含义的字符。该方法将一行转换为多行,其余的是直接进行的。

可能有某种方法可以直接执行此操作,对于给定的示例来说效果很好,但请记住,此类搜索的成本显然是指数级的,如果您有几千行,则系统将被冻结。最好分割数据,使其正常化,即使这样,成本也会很高,但比直接分割要低得多。@AngelM。我希望我能使它正常化。此表由另一个我无法控制的进程填充。我需要把这张表看得像是不幸的一样。唯一的好处是它的行数永远不会超过100行好!!!在这种情况下,你似乎已经有了一些正确的答案。我在这里提醒你——每当我发现自己说的话永远不会超过。。。它们几乎不可避免地会增长。您是否有办法创建另一个表并将此数据转换为规范化数据?我知道你来自哪里;当我读到你的评论时,我只是想起了过去的问题。@jwheron我理解你的担忧。这是一个详细信息表,其中包含应运输的车辆类型。除非每个品牌都会创建数千种类型,否则我想我可以假设主/细节组合只有几百行。我知道用字符串存储值是不好的。该列由另一个我无法控制的进程填充。但是感谢您的回答,只需添加DISTINCT to SELECT值,就好像您尝试使用某些产生重复数据的数据集一样,这种方式将产生重复数据。顺便说一句,祝贺你,萨尔曼,伟大的解决方案!!!