Возвращаемая разница 2 строк SQL Server 2008 - PullRequest
0 голосов
/ 11 марта 2020

Есть 2 строки. Эти строки могут иметь различия. Мне нужно вернуть разные значения «Разница» и «Положение» этих значений, которые отличаются.

Как найти разность между двумя строками в SQL

В приведенном выше посте показано что-то похожее, однако моя строка ничем не отделена, поэтому у меня возникли проблемы с применением этого метода. Обе строки всегда будут иметь длину 24 символа. Однако различия будут различаться, поэтому я не могу просто сравнить позицию 1 строки String1 с позицией 1 строки String2.

В идеале представление значений дисперсии меньше всего одинакового было бы лучше, учитывая, что каждая позиция имеет смысл. Однако, было бы очень полезно заставить меня показать разницу.

enter image description here

1 Ответ

2 голосов
/ 11 марта 2020

Это ужасно, но ...

Во-первых, возьмите себе копию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...