繁体   English   中英

如何在 SQL 中找到两个字符串之间的差异

[英]How to find diff between two strings in SQL

我有两个字符串,我想得到 SQL 中两个字符串的内容之间的差异?

例如,

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

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

现在我想要两个字符串之间的区别为“a,c,d”

两个字符串都必须拆分成各自的部分。 在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,'')

有趣的任务,是业务需求还是其他?

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

首先从下面的链接中获取函数,以逗号分隔的字符串进行解析,以在Where子句中生成IN字符串列表

然后使用以下查询;

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

这将为您带来以下结果;

val val
a   NULL
c   NULL
d   NULL

简单方法

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

select REPLACE(@String2,@string1,'')

结果

, Pinapple, Grapes

可能是矫枉过正,但我注意到这只会 go 一个方向而不是另一个。 EG:变量 2 有添加,但如果变量 1 有,则忽略。 我将利用 SQL 2016 和更高版本中的新功能利用 OPENJSON 来伪造 JSON 阵列。 您可以很容易地将其变成可重复使用的 function:

DECLARE
    @X VARCHAR(1024) = 'a,b,c'
,   @Y VARCHAR(1024) = 'a,b,d,e'
;

DECLARE 
    @Delimeter VARCHAR(8) = ','  --May use a comma, maybe a ;
,   @AddText VARCHAR(MAX) = 'Added: '  --Choose what to say for adds
,   @RemoveText VARCHAR(MAX) = 'Removed: '  --Choose what to say for removes

--Leave below variables alone as they are used for business logic
,   @ReturnText VARCHAR(MAX) = ''  
,   @Added VARCHAR(MAX)
,   @Removed VARCHAR(MAX)
;

SELECT @X = '["' + REPLACE(@X, '' + @Delimeter + '', '","') + '"]'  --get input ready for JSON 
SELECT @Y = '["' + REPLACE(@Y, '' + @Delimeter + '', '","') + '"]'  --get input ready for JSON 
;

SELECT @Added = STUFF(
    (SELECT ',' + v
    from 
        ( SELECT RTRIM(LTRIM(Value)) AS v FROM OPENJSON(@Y) EXCEPT  SELECT RTRIM(LTRIM(Value)) FROM OPENJSON(@X)) AS x
    FOR XML PATH('')), 1, 1, '')

SELECT @Removed = STUFF(
    (SELECT ',' + v
    from 
        ( SELECT RTRIM(LTRIM(Value)) AS v FROM OPENJSON(@X) EXCEPT  SELECT RTRIM(LTRIM(Value)) FROM OPENJSON(@Y)) AS x
    FOR XML PATH('')), 1, 1, '')

IF LEN(@Added) > 0
BEGIN
    IF LEN(@AddText) > 0
    BEGIN
        SELECT @ReturnText += @AddText
    END

    SELECT @ReturnText += @Added
END

IF LEN(@Removed) > 0
BEGIN
    IF LEN(@ReturnText) > 0
    BEGIN
        SELECT @ReturnText += ' '
    END

    IF LEN(@RemoveText) > 0
    BEGIN
        SELECT @ReturnText += @RemoveText
    END

    SELECT @ReturnText += @Removed
END

SELECT @ReturnText

这将产生: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM