Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Fuzzy-Matching

Eine ziemlich schnelle domänenspezifische Lösung kann darin bestehen, eine Zeichenfolgenähnlichkeit mit SOUNDEX und einem numerischen Abstand zwischen 2 Zeichenfolgen zu berechnen. Dies hilft nur dann wirklich, wenn Sie viele Produktcodes haben.

Mit einem einfachen UDF wie unten können Sie die numerischen Zeichen aus einer Zeichenfolge extrahieren, sodass Sie dann 2200 aus „CLC 2200npk“ und 1100 aus „CLC 1100“ erhalten, sodass Sie jetzt die Nähe basierend auf der SOUNDEX-Ausgabe jeder Eingabe bestimmen können sowie Nähe der numerischen Komponente jeder Eingabe.

CREATE Function [dbo].[ExtractNumeric](@input VARCHAR(1000))
RETURNS INT
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @input) > 0
    BEGIN
        SET @input = STUFF(@input, PATINDEX('%[^0-9]%', @input), 1, '')
    END
    IF @input = '' OR @input IS NULL
        SET @input = '0'
    RETURN CAST(@input AS INT)
END
GO

Was Allzweckalgorithmen angeht, gibt es ein paar, die Ihnen je nach Datensatzgröße und Leistungsanforderungen mit unterschiedlichem Erfolg helfen können. (für beide Links sind TSQL-Implementierungen verfügbar)

  • Double Metaphone - Dieser Algo gibt Ihnen eine bessere Übereinstimmung als Soundex auf Kosten der Geschwindigkeit, aber er ist wirklich gut für die Rechtschreibkorrektur.
  • Levenshtein-Distanz - Dies berechnet, wie viele Tastendrücke erforderlich wären, um eine Saite in eine andere umzuwandeln, um beispielsweise von 'CLC 2200npk' zu 'CLC 2200' zu gelangen, 3, während es von 'CLC 2200npk' zu 'CLC 1100' sind 5.

Hier ist ein interessanter Artikel, der beide Algorithmen zusammen anwendet, was Ihnen vielleicht ein paar Ideen geben kann.

Nun, hoffentlich hilft einiges davon ein wenig.

BEARBEITEN:Hier ist eine viel schnellere partielle Levenshtein-Distanzimplementierung (lesen Sie den Beitrag, der nicht genau die gleichen Ergebnisse wie die normale liefert). Auf meiner Testtabelle mit 125000 Zeilen läuft es in 6 Sekunden im Vergleich zu 60 Sekunden für die erste, die ich verlinkt habe.