2017-10-13 53 views
0

如果我在表中有一个类似于'10,10,20,30,40,20'的值,那么我想使它成为'10,20,30,40,40 '使用sql从字符串中删除重复项

有没有什么sql函数可以做这样的事情?

感谢 Sudhakar

+1

多个值不存储在单个列中。而应将其存储在相关表格中的单独记录中。然后用'DISTINCT'很容易。余也有更多的安全(正确的数据类型)和更好的性能。 –

+0

使用分割功能,然后选择截然不同的结果,并使用合并技巧放入字符串 – RegBes

+0

是的,我知道这是我的朋友。但问题在于它是老旧系统,客户只希望这样。他还没有准备好改变设计,因为他担心可能会影响遗留系统的其他功能 因此,我被迫按照现在的方式使用设计:( –

回答

1

这篇很久以前。这可能需要一些修改。但它会产生输出。

尝试:用杰夫的DelimitedSplit8K

DECLARE @Data_String AS VARCHAR(1000), @Result as varchar(1000)='' 
SET @Data_String = '10,10,20,30,40,20' 
SET @Data_String = REPLACE(@Data_String,'|',',') 

select @Data_String; 

SELECT @[email protected]+col+',' from(
    SELECT DISTINCT t.c.value('.','varchar(100)') col from(
     SELECT cast('<A>'+replace(@Data_String,',','</A><A>')+'</A>' as  xml)col1)data 
    cross apply col1.nodes('/A') as t(c))Data 
SELECT LEFT(@Result,LEN(@Result)-1) 
0

相信它存储整数你可以先创建一个功能,你需要分割的数值让他们则必须使用不同功能如下

第一个创建功能,如

CREATE FUNCTION [dbo].[idpGetSplitedString] 
(
    @String varchar(8000), 
    @Delimiter char(1) 
) 
RETURNS 
@temptable TABLE 
(
    items varchar(8000) 
) 
AS 
BEGIN 
    declare @idx int   
    declare @slice varchar(8000)   

    select @idx = 1   
     if len(@String)<1 or @String is null return   

    while @idx!= 0   
    begin   
     set @idx = charindex(@Delimiter,@String)   
     if @idx!=0   
      set @slice = left(@String,@idx - 1)   
     else   
      set @slice = @String   

     if(len(@slice)>0) 
      insert into @temptable(Items) values(rtrim(ltrim(@slice)))   

     set @String = right(@String,len(@String) - @idx)   
     if len(@String) = 0 break   
    end 

    RETURN 
END 

然后调用等

功能中选择[DBO] .idpGetSplitedString作为值

+1

你需要环顾四周,找到一个更好的分离器。很好的例子。这里有很多其他更好的选择。http://sqlperformance.com/2012/07/t-sql-queries/split-strings循环不是一个好的。 –

+0

任何为此?它的工作 –

+0

当然,它会做分裂,但它超慢。 –