2016-11-09 2 views
-2

Ich habe zwei Strings, möchte ich den Unterschied zwischen den Inhalten von zwei Strings in SQL ??Wie bekomme ich genaues Zeichen Diff zwischen zwei Zeichenfolgen in SQL

zum Beispiel

Declare @String1 as varchar(100)='Please check requirement and let me know your feedback.'; 

Declare @String2 as varchar(100)='Please checkout requirement & let me know your feedback'; 

Ergebnis sollte wie die Worte sein, die sowohl in der Zeichenfolge nicht üblich sind.

zB Kasse, &

+0

Schlussfolgerung aus einem einzigen Beispiel ist problematisch. Haben Sie weitere Beispiele für erwartete Eingaben und die von Ihnen gesuchten Ergebnisse? I.e. suchst du eigentlich nach [edit distance] (https://en.wikipedia.org/wiki/Edit_distance)? –

+0

Im Idealfall ändern * Sie nicht nur * von einem Beispiel zu einem völlig anderen. Ich habe nach mehreren Beispielen gefragt und Sie haben das Beispiel entfernt, dass Antworten bereits geschrieben wurden. –

+0

@Damien_The_Unbeliever Ich bin mir nicht sicher über die Frage, deshalb änderte das Beispiel. Ich möchte herausfinden, dass Wörter, die in zwei Strings nicht üblich sind, jede Hilfe geschätzt werden. –

Antwort

1

Dieser Code wird zuerst geteilt die Saiten in einzelne Wörter und dann Worte überprüfen, die in der anderen Zeichenfolge nicht existieren

Declare @String1 as varchar(100)='Please check requirement and let me know your feedback.'; 
Declare @String2 as varchar(100)='Please checkout requirement & let me know your feedback'; 

WITH s1_Splitted AS 
(
    SELECT wrd.value('.','nvarchar(max)') AS Word 
    FROM 
    (SELECT (
      SELECT CAST('<x>' + REPLACE((SELECT @String1 AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML) 
      ) AS Casted 
    ) AS derived 
    CROSS APPLY derived.Casted.nodes('/x') AS A(wrd) 
) 
,s2_Splitted AS 
(
    SELECT wrd.value('.','nvarchar(max)') AS Word 
    FROM 
    (SELECT (
      SELECT CAST('<x>' + REPLACE((SELECT @String2 AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML) 
      ) AS Casted 
    ) AS derived 
    CROSS APPLY derived.Casted.nodes('/x') AS A(wrd) 
) 
SELECT 'only in s1',s1.Word 
FROM s1_Splitted AS s1 
WHERE NOT EXISTS(SELECT 1 FROM s2_Splitted AS s2 WHERE s2.Word=s1.Word) 
UNION ALL 
SELECT 'only in s2',s2.Word 
FROM s2_Splitted AS s2 
WHERE NOT EXISTS(SELECT 1 FROM s1_Splitted AS s1 WHERE s1.Word=s2.Word) 

Das Ergebnis (Aufmerksamkeit: die . nach Feedback als zwei verschiedene Wörter genommen ...)

only in s1 and 
only in s1 check 
only in s1 feedback. 
only in s2 & 
only in s2 checkout 
only in s2 feedback 
0

@ String1 Angenommen ist ein Präfix von @ String2

select right (@String2,len(@String2)-len(@String1)) 
; 
+0

Dies ist nicht generisch und funktioniert nur in dem in der Frage angegebenen Format. – sagi

+1

@Sagi, gibt es eine allgemeine Definition für den Unterschied zwischen 2 Strings mit einem String-Ergebnis? Was ist der Unterschied zwischen "stackoverflow" und "overrated"? zwischen "Apfel" und "Banane"? –

+0

@DuduMarkovitz - wie ich in den Kommentaren vorgeschlagen habe, eine * gemeinsame * Metrik ist Bearbeitungsabstand, aber das OP hat noch nicht wirklich geklärt, was sie bedeuten, jenseits einer magischen "Ich weiß, was der Unterschied ist, damit der Computer es auch weiß " –

1

Sie REPLACE als unten verwenden:

SELECT REPLACE(CASE WHEN LEN(@String1) < LEN(@String2) THEN @String2 ELSE @String1 END, 
       CASE WHEN LEN(@String1) < LEN(@String2) THEN @String1 ELSE @String2 END, '') 

Ergebnis: .com

+1

Ich denke, du solltest auch den umgekehrten Ersatz machen, da '@ String1' die größere Zeichenfolge sein kann. +1 obwohl. – sagi

+0

@sagi Ich dachte schon – NEER

Verwandte Themen