如何从 SQL server 2016 的表格中删除字符串中的重复项

3

我有一张表格,其中包含一个字符串列。这些字符串由;分隔。现在我想在字符串拆分后删除重复项。例如:

-----------
| w;w;e;e |
-----------
| q;r;r;q |
-----------
| b;n;n;b |
-----------

结果应该是:
-------
| w;e |
-------
| q;r |
-------
| b;n |
-------

同时它不应该是一个Select函数,而是一个(不确定是否为100%)delete函数。因此,在原始表中的值将不再重复。
2个回答

5

对于一个update语句,这将去重你的列:

update t 
  set col = stuff((
    select distinct
      ';'+s.Value
    from string_split(t.col,';') as s
    for xml path (''), type).value('.','varchar(1024)')
    ,1,1,'');

在 SQL Server 2016 中,您可以使用 string_split()stuff() with select ... for xml path ('') method of string concatenation 来连接仅唯一的值。
select 
    t.id
  , t.col
  , dedup = stuff((
    select distinct
      ';'+s.Value
    from string_split(t.col,';') as s
    for xml path (''), type).value('.','varchar(1024)')
    ,1,1,'')
from t

dbfiddle演示: 这里

rextester演示: http://rextester.com/MAME55141; 本演示在没有 string_split() 函数的情况下使用了Jeff Moden的CSV分割器函数。

返回:

+----+---------+-------+
| id |   col   | dedup |
+----+---------+-------+
|  1 | w;w;e;e | e;w   |
|  2 | q;r;r;q | q;r   |
|  3 | b;n;n;b | b;n   |
+----+---------+-------+

分割字符串参考:


你好SqlZim,感谢你的回答。虽然它只选择了列,但似乎并没有从我的表中删除重复项,我是对的吗?或者我应该使用新的“dedup”列来替换我的表并删除旧的列?因为新的dedup列没有保存在我的表中? - wouter de jong
@wouterdejong 已更新答案,提供了一个 update 语句的示例,以获取 col 的去重值。 - SqlZim

0
如果字符串中只有 "e"、"r" 和 "w" 这三个值,那么最简单的方法就是重构字符串:
select stuff( (case when string like '%e%' then ';e' else '' end) +
              (case when string like '%r%' then ';r' else '' end) +
              (case when string like '%w%' then ';w' else '' end),
              1, 1, ''
            )

我怀疑这些值可能会受到限制,因为它们看起来像是文件权限(读/写/执行)。否则,你需要将字符串解析成单独的行(使用XML、UDF或递归CTE)并重新组合这些值。

你应该从中吸取教训。不要把列表存储在字符串中。如果我对只有少数几个值正确的话,这些值应该是标志。或者它们应该是另一个表的单独行。


嘿,Gordon,谢谢你的回答。在我的情况下,唯一的值不仅仅是 erw。这些只是我用来让示例更容易理解的一些 字符串。我稍微改了一下示例,使它更清晰明了。 - wouter de jong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接