[英]Find rows that contain same value inside comma separated values
我有一個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中完成嗎?
您可以使用笨重的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
)
CAST(... AS XML)
部分假定您的數據不包含在XML中具有特殊含義的字符。 nodes
方法將一行轉換為多行,rest是直接的。
這是錯誤的數據結構。 不要將值存儲在字符串中!
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.