【问题标题】:How to remove duplicates within a string from the table in SQL server 2016如何从 SQL Server 2016 中的表中删除字符串中的重复项
【发布时间】:2017-03-12 14:34:15
【问题描述】:

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

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

结果应该是:

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

此外,它不应该是 Select 函数,而是(不是 100% 确定)delete 函数。这样原表中的值就不会再重复了。

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:

    对于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 演示:here

    rextester 演示:http://rextester.com/MAME55141;此演示使用 Jeff Moden 在没有 string_split() 的情况下提供的 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 列并删除旧的?因为新的去重列没有保存在我的表中?
    • @wouterdejong 使用update 语句的示例更新了答案,以获取col 的重复数据删除值。
    【解决方案2】:

    如果字符串中只有“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)并重新组合值。

    你应该在这里吸取教训。不要将列表存储在字符串中。这些值应该是标志(如果我对只有少数几个值是正确的)。或者,它们应该位于另一个表的不同行上。

    【讨论】:

    • 嘿戈登,谢谢你的回答。在我的情况下,唯一的值不仅仅是erw。这些只是我用来使示例更易于理解的一些strings。我稍微改变了示例以使其更清晰。
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2020-06-09
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多