Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да премахнете дубликати от низ в SQL

Вариант 1 с функция за анализ

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

Връщане

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

Вариант 2:Без функция за анализ

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

Връщане

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

СДС при интерес

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TABLESAMPLE връща грешен брой редове?

  2. Ефективен начин за получаване на максималната стойност на текущия сбор в TSQL

  3. Грешка в SQL сървъра:низови или двоични данни ще бъдат съкратени

  4. SQL:Имате проблеми със заявка, която получава проценти с помощта на агрегатни функции

  5. SqlBulkCopy от списък<>