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
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
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)
Jeffs DelimitedSplit8K mit von http://www.sqlservercentral.com/articles/Tally+Table/72993/
declare @value varchar(100) = '10,10,20,30,40,20',
@new_value varchar(100)
select @new_value = isnull(@new_value + ',', '') + Item
from DelimitedSplit8K(@value, ',')
group by Item
order by Item
select @new_value
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
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. –
irgendeinen dafür ?? cos dieses tut sein Job –
Sicher wird es die Spaltung tun, aber es macht es super langsam. –
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. –
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
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 :( –