Warum gibt die Differenzfunktion unterschiedliche Ergebnisse, wenn die Reihenfolge der zu vergleichenden Zeichenfolgen geändert wird?

8

In SQL Server, wenn ich Folgendes mache:

%Vor%

Wenn ich das tue:

%Vor%

Ich dachte, die Difference-Funktion betrachtet die Soundex-Werte unter der Haube und gibt eine 0-4-Zahl an, wie viele Zeichen an derselben Stelle sind.

%Vor%     
user3476554 31.10.2016, 18:05
quelle

3 Antworten

4

Dies ist streng beobachtend. Die Dokumentation ist ziemlich klar:

  

Die zurückgegebene Ganzzahl ist die Anzahl der Zeichen in den SOUNDEX-Werten   das sind die gleichen. Der Rückgabewert liegt zwischen 0 und 4: 0   zeigt schwache oder keine Ähnlichkeit an, und 4 zeigt starke Ähnlichkeit oder an   die gleichen Werte.

Gemäß dieser Dokumentation sollte der Rückgabewert nicht basierend auf der Reihenfolge der Argumente abweichen.

Von meinen Fragen: "Kennady" - & gt; K530 und "Kary" - & gt; K600. Diese haben zwei gemeinsame Zeichen, daher sollte der Wert 2 sein.

Jetzt bemerke ich, dass "Kenn" - & gt; K500. Das Abschneiden von "Kennady" auf die Länge von "Kary" ergibt den Wert "3". Hmmm.

Daher denke ich, dass DIFFERENCE() die Länge des ersten Arguments benutzt, um das zweite Argument zu trunkieren. Das macht die Reihenfolge der Argumente wichtig. Setzen Sie das längere Argument zuerst.

Ich habe das an einigen anderen Saiten ausprobiert. Die gleichen Muster scheinen zu funktionieren. Ich habe keine Dokumentation gefunden, die angibt, dass dies der Fall ist.

Ich nehme an, Microsoft würde dies ein "Feature" und kein "Bug" nennen;).

BEARBEITEN:

Die obige Spekulation ist nicht ganz korrekt. Berücksichtigen Sie Folgendes:

  • leepaupauld - & gt; L114
  • leopold - & gt; L143
  • leepaup - & gt; L110

Allerdings

  • Unterschied (leepaupauld, leopold) = 4 (!)
  • Unterschied (leopold, leepaupauld) = 3
  • Unterschied (leepaup, leopold) = 3 (!)
  • Unterschied (leopold, leepaup) = 2

Das (!) ist meines Erachtens, dass das Ergebnis angesichts der soundex-Werte für die Strings überhaupt keinen Sinn ergibt.

Also, das Problem ist nicht die Länge. Es ist die zugrunde liegende Methode, auf die @jpw im Kommentar verweist. Das Problem scheint doppelte übereinstimmende Werte in einer Zeichenfolge zu sein. Laut der Dokumentation sollten diese jedoch nicht mehrmals mit demselben Zeichen übereinstimmen.

Mein Rat: Levenshtein Entfernung verwenden. Es macht Sinn. Es funktioniert besser bei längeren Saiten. Es ist gesund. Es ist nicht integriert, aber es ist einfach genug, eine Implementierung im Web für jede Datenbank zu finden.

    
Gordon Linoff 31.10.2016 18:17
quelle
0

Antwort mit Beispiel. Vergleiche 'Bathilda' und 'Bagshott'

Erstens: Bathilda Soundex B-343, Zweitens: Bagshot Soundex-B-230 Zweite Suche zuerst. Erstes Spiel: B; Nächste Suche beginnt nach B, mit 3 Die '2' gibt keine Übereinstimmung zurück. Das zweite Spiel ist 3 von den zweiten Spielen zuerst 3 von zuerst. Iteration beginnt bei 2. Das dritte Spiel ist 3 aus dem zweiten Match und das dritte aus dem ersten Match. Ergebnis ist 3.

Umgekehrt - jetzt zuerst ist Bagshot Soundex-B-230, Sekunde ist: Bathilda Soundex B-343 Das erste Spiel ist wieder B. Iteration beginnt bei 2. Das zweite Spiel ist die erste 3 aus dem zweiten Spiel 3 von der ersten. Es werden keine weiteren Iterationen durchgeführt, da 3 in der ersten der letzte Buchstabe ist.

Erklärung: FROM Ссылка : "DIFFERENCE und SOUNDEX sind kollationssensitiv." Das bedeutet, dass jede Suche nach der letzten Übereinstimmung beginnt und zum letzten Zeichen in der Sequenz geht. Aus diesem Grund ergeben zwei Sequenzen mit der gleichen Anzahl von Zeichen und gleichen Zeichen ein Ergebnis von weniger als 4. Zum Beispiel: Differenz für 'Brts' und 'Btrs' ergibt Ergebnis 2.

    
αNerd 31.10.2016 19:19
quelle
0

Referenzieren Sie den letzten Post hier, der den Algorithmus erklärt: Ссылка

HINWEIS: Das ist alles meine Meinung, was passiert.

Nach diesem Post verwendet es den FIRST-Parameter und durchläuft Zeichen für Zeichen nach Übereinstimmungen in den zweiten Parametern.

Als Beispiel, mein Name "Vogel" = V240 in SOUNDEX. "Vasquez" = V220.

%Vor%

Weil es "V", "2", "4" und "0" prüft und 3 Übereinstimmungen findet.

Allerdings

%Vor%

Weil es "V", "2", "2" und "0" prüft und 4 Übereinstimmungen findet.

Es scheint, wenn der erste Parameter einen soundex mit irgendwelchen duplizierenden Ziffern hat, kann es zu unerwarteten Ergebnissen führen.

    
Jason Vogel 14.11.2017 19:15
quelle

Tags und Links