【问题标题】:Return Difference of 2 Strings SQL Server 2008返回 2 个字符串的差异 SQL Server 2008
【发布时间】:2020-03-11 18:22:01
【问题描述】:

有 2 个字符串。这些字符串可能有差异。我需要返回不同的值“差异”和那些不同的值的“位置”。

How to find diff between two string in SQL

上面的帖子显示了类似的内容,但是,我的字符串没有被任何东西分隔,所以我无法应用该方法。两个字符串的长度始终为 24 个字符。但是,差异会有所不同,所以我不能只比较 String1 的位置 1 和 String2 的位置 1。

理想情况下,考虑到每个位置都有含义,表示方差值减去任何相同的值会更好。但是,让我仅仅展示差异会非常有帮助。

【问题讨论】:

  • 。 . SQL 不是为这类事情而设计的。如果必须,可以使用递归 CTE,但会很麻烦。

标签: sql sql-server-2008 ssms


【解决方案1】:

这很丑,但是...

首先,获取一份NGrams8K 的副本。然后你可以这样做:

DECLARE @String1 varchar(8000) = 'abcd10234619843ab13',
        @String2 varchar(8000) = 'bbcd10234619843ac14';
WITH C AS(
    SELECT @String1 AS String1,
           @String2 AS String2,
           S1.[position],
           S1.token AS C1,
           S2.token AS C2
    FROM dbo.NGrams8k(@String1,1) S1
         JOIN dbo.NGrams8k(@String2,1) S2 ON S1.[position] = S2.position)
SELECT (SELECT '' + C.C2
        FROM C
        WHERE C.C1 != C.C2
        ORDER BY C.[position]
        FOR XML PATH(''),TYPE).value('.','varchar(8000)') AS Difference,
       (SELECT ISNULL(NULLIF(C.C2,C.C1),'-')
        FROM C
        ORDER BY C.[position]
        FOR XML PATH(''),TYPE).value('.','varchar(8000)') AS Ideal,
       STUFF((SELECT CONCAT(',',C.[position])
              FROM C
              WHERE C.C1 != C.C2
              ORDER BY C.[position]
              FOR XML PATH(''),TYPE).value('.','varchar(8000)'),1,1,'') AS Position;

如果您使用的是较新且受支持版本的 SQL Server,这实际上要容易得多,只需扫描一次所需的值:

DECLARE @String1 varchar(8000) = 'abcd10234619843ab13',
        @String2 varchar(8000) = 'bbcd10234619843ac14';
WITH C AS(
    SELECT @String1 AS String1,
           @String2 AS String2,
           S1.[position],
           S1.token AS C1,
           S2.token AS C2
    FROM dbo.NGrams8k(@String1,1) S1
         JOIN dbo.NGrams8k(@String2,1) S2 ON S1.[position] = S2.position)
SELECT STRING_AGG(NULLIF(C.C2,C.C1),'') WITHIN GROUP (ORDER BY C.position) AS Difference,
       STRING_AGG(ISNULL(NULLIF(C.C2,C.C1),'-'),'') WITHIN GROUP (ORDER BY C.position) AS Ideal,
       STRING_AGG(CASE C.C1 WHEN C.C2 THEN NULL ELSE C.[position] END,',') WITHIN GROUP (ORDER BY C.position) AS Position
FROM C

【讨论】:

  • 我会打扫的。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2013-01-11
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多