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

Как да намерите разлика между два низа в SQL

И двата низа трябва да бъдат разделени на части. В SQL-Server 2008 това е най-добре да се направи с XML подход.

внимание :Ако вашите данни може да включват забранени знаци като <>öä@€& а не само обикновени латински знаци като във вашия пример, ще ви трябват допълнителни усилия...

Останалото е сравнително лесно:просто вземете всички части на @String1 които не се намират в @String2 .

Конкатенираният резултат е - отново - най-добре да бъде направен чрез XML

Опитайте това:

Declare @String1 as varchar(100)='a,b,c,d,e';

Declare @String2 as varchar(100)='b,e';

WITH FirstStringSplit(S1) AS
(
    SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML)
)
,SecondStringSplit(S2) AS
(
    SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML)
)

SELECT STUFF(
(
    SELECT ',' + part1.value('.','nvarchar(max)')
    FROM FirstStringSplit
    CROSS APPLY S1.nodes('/x') AS A(part1)
    WHERE part1.value('.','nvarchar(max)') NOT IN(SELECT B.part2.value('.','nvarchar(max)')
                                                  FROM SecondStringSplit 
                                                  CROSS APPLY S2.nodes('/x') AS B(part2)
                                                  ) 
    FOR XML PATH('')

),1,1,'')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изваждане между две sql заявки

  2. Търсене на текст в съхранена процедура в SQL Server

  3. Тригери на SQL Server – Част 2 DDL &LOGON тригери

  4. Какво означава varchar(-1)?

  5. Грешка „Трябва да декларира скаларната променлива“ при предаване на параметър с таблична стойност към параметризиран SQL оператор