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