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

Gui*_*doG 5 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
Run Code Online (Sandbox Code Playgroud)

所以表中包含

value   
-----   
NB,BD,FR    
BD,GK   
SL,SR   
Run Code Online (Sandbox Code Playgroud)

从上面的例子我想得到

value   
-----   
NB,BD,FR    
BD,GK   
Run Code Online (Sandbox Code Playgroud)

因为BD两行中都存在一个值(在这种情况下可以是任何东西)

这可以在sql中完成吗?

Sal*_*n A 3

您可以使用笨重的 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
)
Run Code Online (Sandbox Code Playgroud)

CAST(... AS XML)部分假设您的数据不包含在 XML 中具有特殊含义的字符。该nodes方法会将一行转换为多行,其余的很简单。