SoundEx-Funktion - aber schnell!

Wie war doch gleich noch mal der genaue Name? Schmidt, Schmitt oder Smith? Wer nach Namen suchen muss, weiß die SoundEx-Funktion zu schätzen. Mit ihr kann man nach ähnlich klingenden Namen suchen. Das ist auch als unscharfe Suche bekannt und besonders für Datenbanken äußerst nützlich.

Die SoundEx-Funktion bekommt den zu vergleichenden String − also z. B. den Namen − übergeben und gibt einen anderen String zurück, der für ähnliche Vergleichsstrings identisch ist. Das erste Zeichen des Vergleichsstrings bleibt dabei unverändert, die weiteren Zeichen des Vergleichsstrings werden durch je eine Ziffer ersetzt. Dabei bekommen ähnlich klingende Konsonanten wie z. B. b, f, p, v jeweils die gleiche Ziffer. Buchstabenwiederholungen, Sonderzeichen und Vokale werden ignoriert und nach drei Ziffern wird die Funktion beendet. Heraus kommt ein maximal vierstelliger SoundEx-Code, etwa der Art m262. Nun können andere Datensätze mit dem gleichen Soundex-Code in einer Abfrage gesucht werden.

Diese altbekannte Funktion ist schon lange für VBA konvertiert worden, war aber bisher ziemlich langsam. Hier nun eine überarbeitete, ca. 400% schnellere Version. Diese Performancesteigerung klappte dank eines einfachen Tricks: Ein Computer kann Zahlen nämlich sehr viel schneller verarbeiten als Text. Daher wird der Vergleichsstring einem ByteArray zugeordnet:


Dim t() As Byte
t() = strVergleichsstring

Der Array t() wird so mit den ANSI-Werten des Vergleichsstrings belegt. Jedes zweite Feld im Array enthält je ein Zeichen des Vergleichsstrings (die Felder dazwischen enthalten üblicherweise den Wert 0, da Microsoft Office mit Unicode 16 arbeitet. Sonderzeichen, die nicht ANSI entsprechen, werden aber von Soundex ohnehin ignoriert). Mit Bytewerten kann der Computer anschließend wesentlich schneller arbeiten als mit dem String.

Übrigens ist die Idee für diese Version einst auf dem Access-Stammtisch Rhein-Main entstanden.

Download: soundex.zip