Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment trouver un diff entre deux chaînes en SQL

Les deux cordes doivent être divisées en leurs parties. Dans SQL-Server 2008, il est préférable d'utiliser une approche XML.

attention :Si vos données peuvent inclure des caractères interdits comme <>öä@€& et pas seulement des caractères latins simples comme dans votre exemple, vous auriez besoin d'un effort supplémentaire...

Le reste est assez simple :il suffit de prendre toutes les parties de @String1 qui ne se trouvent pas dans @String2 .

Le résultat concaténé est - encore une fois - préférable d'être fait via XML

Essayez ceci :

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,'')