我已经研究了一段时间了,我找不到从SQL Server 2000中用逗号分隔的字符串删除重复字符串的方法。我可以在SQL Server 2005和2008中找到很多这样的示例但是不是2000年。
给出字符串 测试,TEST2,测试,TEST3,TEST2
有谁知道你会如何归还test,test2,test3
?
答案 0 :(得分:3)
您可以使用while循环来解析字符串并将您找到的值放在临时变量中,在添加值之前,请检查它是否已添加。
declare @S varchar(50)
declare @T varchar(50)
declare @W varchar(50)
set @S = 'test,test2,test,test3,test2'
set @T = ','
while len(@S) > 0
begin
set @W = left(@S, charindex(',', @S+',')-1)+','
if charindex(','+@W, @T) = 0
set @T = @T + @W
set @S = stuff(@S, 1, charindex(',', @S+','), '')
end
set @S = substring(@T, 2, len(@T)-2)
print @S
如果要在查询中执行此操作,则需要将上面的代码放在函数中。
create function dbo.RemoveDups(@S varchar(50))
returns varchar(50)
as
begin
declare @T varchar(50)
declare @W varchar(50)
set @T = ','
while len(@S) > 0
begin
set @W = left(@S, charindex(',', @S+',')-1)+','
if charindex(','+@W, @T) = 0
set @T = @T + @W
set @S = stuff(@S, 1, charindex(',', @S+','), '')
end
return substring(@T, 2, len(@T)-2)
end
并像这样使用
select dbo.RemoveDups(ColumnName) as DupeFreeString
from YourTable
答案 1 :(得分:0)
我在Oracle中寻找这个。我偶然发现了另一种解决方案。对于那些试图在Oracle中使用查询执行相同操作的人。请尝试以下查询
with t as (select 'SCOTT,ALLEN,KING,SCOTT' as in_cls from dual)
, t1 as ( select distinct regexp_substr(in_cls, '[^,]+', 1, rownum) names
from t
connect by rownum <= length(regexp_replace(in_cls, '[^,]'))+1)
SELECT
RTrim(xmlagg(xmlelement(a,names||',').extract('//text()')),',') string
from t1
结果STRING
ALLEN,SCOTT,KING
答案 2 :(得分:0)
可能需要稍微调整一下。我稍微扩大了字段然后尝试了:
SELECT dbo.RemoveDups('Procedure, Missing Attestation, Procedure, Incomplete Note, Missing technique');
但它错过了Procedure
上的重复。