2017-10-13 87 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

當然,它會做分裂,但它超慢。 –