2017-10-13 2 views
0

Wenn ich einen Wert wie "10, 10,20,30,40,20" in einem Feld der Tabelle habe, dann möchte ich es als "10, 20,30,40 'Entfernen von Duplikaten aus String mit sql

Gibt es irgendeine SQL-Funktion, um so etwas zu tun?

Dank Sudhakar

+1

nicht mehrere Werte in einer einzigen Spalte lagern. Speichern Sie sie stattdessen in separaten Datensätzen in einer verwandten Tabelle. Dann ist es einfach mit 'DISTINCT'. Sie haben auch mehr Sicherheit (korrekter Datentyp) und viel bessere Leistung. –

+0

Verwenden Sie die Split-Funktion, und wählen Sie dann distinct auf die Ergebnisse an und setzen Sie sie in eine Zeichenfolge mit dem Koaleszenz-Trick – RegBes

+0

Ja, mein Freund, ich weiß es. Aber das Problem ist, es ist ein uraltes System und Client will nur so. Er ist nicht bereit, das Design zu ändern, da er befürchtet, dass es andere Funktionen des Altsystems beeinträchtigen könnte. So bin ich gezwungen, das Design so zu verwenden, wie es jetzt ist :( –

Antwort

1

Hat diese vor langer Zeit. Dies könnte einige Änderungen erfordern. Aber es erzeugt eine Ausgabe.

Versuchen:

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

glauben, es speichert ganze Zahl Sie können sie erhalten mit einer Funktion zu schaffen zuerst müssen Sie die Werte geteilt dann verwenden müssen eindeutige Funktion wie unten

1. Erstellen Sie eine Funktion wie

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 

dann rufen Sie die Funktion wie

wählen Sie [dbo] .idpGetSplitedString als Werte

+1

Sie müssen sich umsehen und einen besseren Splitter finden.Der von Jeff Moden oben verlinkte ist ein gutes Beispiel: Hier sind viele andere, viel bessere Alternativen: http://sqlperformance.com/2012/07/t-sql-queries/split-strings Looping ist nicht gut für das. –

+0

irgendeinen dafür ?? cos dieses tut sein Job –

+0

Sicher wird es die Spaltung tun, aber es macht es super langsam. –

Verwandte Themen