SQL:如何替换列中的重复字符?

时间:2012-08-16 16:53:59

标签: sql-server replace duplicates

我有一个名为“Mergecodes”的列,其中包含以逗号分隔的字符(或对)。某些条目包含需要删除的倍数。以下是“KD”是重复的示例,因此需要删除:“ T,M,KD,SB,KD ”。我想这可以通过计算出现次数来计算,如果它包含多个,则删除附加内容。我只是不确定这个的语法。任何帮助将不胜感激。谢谢!

更新

当使用@Yaroslav建议使用字符串('T,M,KD,SB,KD')时,我能够得到结果,但是当我使用列而不是字符串时,我得不到任何结果。有什么想法吗?

declare @str varchar(100)
select @str = mergecodes from GoldMineTest.dbo.CONTACT1
declare  @separator varchar(1)= ','

;WITH tokens(p, a, b) AS
        (
            SELECT 1, 1, CHARINDEX(@separator, @str)
             UNION ALL
            SELECT p + 1, b + 1, CHARINDEX(@separator, @str, b + 1)
              FROM tokens
             WHERE b > 0
        )
SELECT SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END) AS Separated_values, count(SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END))
  FROM tokens
 GROUP BY SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END)
HAVING count(SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END))=1

1 个答案:

答案 0 :(得分:1)

已编辑:请参阅此SQL Fiddle demo code

我最终做的是创建一个函数,它接受每一行,分隔删除重复的值,然后再次连接它们以返回没有重复值的新行。在函数内部,先前发布的代码用于获取删除重复项的分隔值。仅当您要完全删除该特定行上重复的字符集时,HAVING才是必需的。

使用MS SQL Server。此代码应该适应您的需求。它将输出一个由重复分隔符分隔的非重复字符串列表。你需要的是连接结果......没有时间来制定更详细的答案......

DECLARE @str varchar(4000)='T,M,KD,SB,KD',
        @separator varchar(1)= ','

;WITH tokens(p, a, b) AS
        (
            SELECT 1, 1, CHARINDEX(@separator, @str)
             UNION ALL
            SELECT p + 1, b + 1, CHARINDEX(@separator, @str, b + 1)
              FROM tokens
             WHERE b > 0
        )
SELECT SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END) AS Separated_values, count(SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END))
  FROM tokens
 GROUP BY SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END)
HAVING count(SUBSTRING(@str, a, CASE WHEN b > 0 THEN b-a ELSE 4000 END))=1