簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM