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中完成吗?
您可以使用笨重的 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方法会将一行转换为多行,其余的很简单。