2017-03-11 11 views
0

Ich habe eine Spalte in meiner SQL-Tabelle, wo einige Werte getrennt sind bij ". Einige Werte in dieser Zeichenfolge sind doppelt vorhanden, die ich entfernen möchte. Hier ist ein Beispiel meiner Daten:So entfernen Sie Duplikate aus einer Zeichenfolge in SQL

--------------- 
| qw"qw"er"er | 
--------------- 
| q"w"w"q  | 
--------------- 
| f"k"s"g  | 
--------------- 

Jetzt Das Ergebnis ersetzen sollten Duplikate:

--------------- 
| qw"er  | 
--------------- 
| q"w"  | 
--------------- 
| f"k"s"g  | 
--------------- 

Also zuerst möchte ich die Zeichenfolge spalten und dann Duplikate entfernen. Könnte mir jemand mit diesem Problem helfen?

+0

speichern niemals mehrere Werte in einer einzigen Spalte! –

+1

@juergend Das ist nicht was ich mache, ich bekomme diese Daten von einem anderen Programm, das es so speichert –

+0

In SQL Server ist es möglich, mit STRING_SPLIT und Cross APPLY zu erreichen. Zeige zuerst den ganzen Tisch. –

Antwort

2

Option 1 mit einem Parse Funktion

Declare @YourTable table (ID int,YourCol varchar(50)) 
Insert Into @YourTable values 
(1,'qw"qw"er"er'), 
(2,'q"w"w"q'), 
(3,'f"k"s"g') 

Select A.ID 
     ,A.YourCol 
     ,DeDuped = Stuff((Select '"' + RetVal 
          From (Select RetSeq=Min(RetSeq),RetVal 
            From [dbo].[udf-Str-Parse](A.YourCol,'"') 
            Group By RetVal) P 
          Order by 1 For XML Path('')),1,1,'') 
From @YourTable A 

Returns

ID YourCol  DeDuped 
1 qw"qw"er"er qw"er 
2 q"w"w"q  q"w 
3 f"k"s"g  f"k"s"g 

Option 2: Ohne Parse Funktion

Declare @YourTable table (ID int,YourCol varchar(50)) 
Insert Into @YourTable values 
(1,'qw"qw"er"er'), 
(2,'q"w"w"q'), 
(3,'f"k"s"g') 

Select A.ID 
     ,A.YourCol 
     ,DeDuped = Stuff((Select '"' + RetVal 
          From (Select RetSeq=Min(RetSeq),RetVal 
            From (
              Select RetSeq = Row_Number() over (Order By (Select null)) 
                ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
              From (Select x = Cast('<x>' + replace((Select replace(A.YourCol,'"','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
              Cross Apply x.nodes('x') AS B(i) 
             ) P1 
            Group By RetVal) P 
          Order by RetSeq 
          For XML Path('')),1,1,'') 
From @YourTable A 

Returns

ID YourCol  DeDuped 
1 qw"qw"er"er qw"er 
2 q"w"w"q  q"w 
3 f"k"s"g  f"k"s"g 

Die UDF, wenn Sie interessieren

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Thanks Shnugo for making this XML safe 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',') 
--Performance On a 5,000 random sample -8K 77.8ms, -1M 79ms (+1.16), -- 91.66ms (+13.8) 
Verwandte Themen