0

我有一个名为“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
4

1 回答 1

1

已编辑:请参阅此SQL Fiddle 演示代码

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

使用 MS SQL 服务器。此代码应适应您的需要。它将输出由分隔符分隔的不重复字符链列表。你只需要连接结果......没有足够的时间来制定更详细的答案......

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
于 2012-08-16T17:03:35.460 回答