How to find diff between two string in SQL

前端 未结 4 822
自闭症患者
自闭症患者 2020-12-21 22:26

I have two strings, I want to get difference between contents of two strings in SQL ??

for example,

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

         


        
相关标签:
4条回答
  • 2020-12-21 22:33

    First take the function from the following link Parse comma-separated string to make IN List of strings in the Where clause

    Then use the following query;

    Declare @String1 as varchar(100)='a,b,c,d,e';
    
    Declare @String2 as varchar(100)='b,e';
    
    SELECT
        s1.val
        ,s2.val
    FROM [dbo].[f_split](@String1,',') s1
    FULL OUTER JOIN [dbo].[f_split](@String2,',') s2
        ON s1.val = s2.val
    WHERE s1.val IS NULL
        OR s2.val IS NULL
    

    Which will give you the following results;

    val val
    a   NULL
    c   NULL
    d   NULL
    
    0 讨论(0)
  • 2020-12-21 22:35

    Simple Way

    declare @string1 varchar(max),@string2 varchar(max)
    set @string1='Apple, Orange, Banana'
    set @string2='Apple, Orange, Banana, Pinapple, Grapes'
    
    select REPLACE(@String2,@string1,'')
    

    Result

    , Pinapple, Grapes
    
    0 讨论(0)
  • 2020-12-21 22:46

    Both strings must be split into their parts. In SQL-Server 2008 this is best to be done with an XML approach.

    attention: If your data might include forbidden characters like <>öä@€& and not just plain latin characters like in your example, you'd need some extra effort...

    The rest is fairly easy: Just take all parts of @String1 which are not found in @String2.

    The concatenated result is - again - best to be done via XML

    Try this:

    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,'')
    
    0 讨论(0)
  • 2020-12-21 22:51

    Interesting task, Is it business requirement or what else?

    Declare @String1 as varchar(100)='a,b,c,d,e';
     SET @String1=REPLACE(@String1,',','')
    
    Declare @String2 as varchar(100)='b,e';
    SET @String2=REPLACE(@String2,',','')
    
    ;WITH StringOne AS (
    
         SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt
         UNION ALL
         SELECT CAST(SUBSTRING(@String1,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt
         FROM StringOne 
         WHERE cnt <= LEN(@String1)
    ),StringTwo AS (
    
     SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt
     UNION ALL
     SELECT CAST(SUBSTRING(@String2,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt
     FROM StringTwo 
     WHERE cnt <= LEN(@String2)
    ),ExceptOperation AS(
    
      SELECT ch FROM StringOne
      EXCEPT
      SELECT ch FROM StringTwo
    )
    
    SELECT STUFF((SELECT ','+ ch FROM ExceptOperation FOR XML PATH('')),1,1,'') 
    
    0 讨论(0)
提交回复
热议问题