Laden...

Stringvergleiche in SQL mit Umlauten

Erstellt von Mr. Bart Simpson vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.769 Views
Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren
Stringvergleiche in SQL mit Umlauten

Ich kämpfe mich derzeit durch ein Problem wie ich am besten eine effiziente (sprich: schnelle) Suche in einer größeren DB machen soll:
Im wesentlichen hab ich dabei eine Tabelle mit Kundendaten (>40 Mio. Datensätze). Nun soll der User nach bestimmten Kunden "suchen" können und gibt dafür verschiedene Parameter an. Das ist solange kein Problem, solange keine Umlaute vorkommen...

Leider ist der Datenbestand aus Altbeständen übernommen, weshalb oft z.B. ein Herr Müller als Mueller eingetragen ist. Nun stellt sich die Frage: "Wie suche ich nach dem?" 🤔

Ich hab schon ein paar Ansätze durchgedacht, aber keinen wirklich guten gefunden - Irgendwelche Vorschläge?

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

S
53 Beiträge seit 2005
vor 17 Jahren

du konntest zb SOUNDEX bzw DIFFERENCE verwenden, oder auch bei Sonderzeichen eine Alternativsuche mit OR hintendranhängen.

Es gibt auch einiges an Tools von Drittherstellern zum Thema "unscharfe Suche".

Ansonsten kann man auch die Benutzer schulen, damit sie wissen das man statt Mayer auch M[ae][iy]er schreiben kann und so auch Möglichkeiten gibt anders heranzugehen.

Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren

An SOUNDEX und Konsorten hab ich auch schon gedacht - ist aber zu unscharf. Da krieg ich dann u.U. viel zu viele Ergebnisse, was das Arbeiten sehr erschwert.

Die Variante mit dem OR hatte ich ebenfalls schon im Blick, aber die folgenden Nachteil:
Wenn mehr als ein Umlaut drin ist, dann muss man (eingentlich) alle Variationen per OR erlauben - dass sowas vorkommt ist zwar zugegebnener Maßen unwahrscheinlich, aber es geht ja ums Prinzip 😉

Die Schulung der Mitarbeiter... hmm das wäre ein Ansatz. Aber wie sagt ein Kollege von mir doch immer so treffend: "They can always built a better idiot!" 😁

Was mir noch einfiele, womit ich aber bisher keinerlei Erfahrung hab: Wie sieht's da mit 'ner Volltextsuche aus?

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

T
433 Beiträge seit 2006
vor 17 Jahren

Du müsstest doch nur einen Parameter in 2 aufteilen.

Beispiel:
Suche nach 'Müüllär' (mir fällt kein Name mit mehreren Umlauten ein 😉)

Umwandeln in:
(Name = 'Müüllär' OR Name = 'Mueuellaer')

Weil es wird ja wohl nicht vorkommen das ü und ue gemischt sind in deinem Datenbestand.

Gruß,
Tom

Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren

Original von Tom
Weil es wird ja wohl nicht vorkommen das ü und ue gemischt sind in deinem Datenbestand.

Tja, wenn dem mal so wäre... Wie gesagt es sind Daten aus "Altbeständen"....

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

K
79 Beiträge seit 2006
vor 17 Jahren

Eine Möglichkeit die mir noch einfällt wären die Platzhalter.

Sprich

SELECT * FROM Tabelle WHERE Name = 'M__ller'

Also in deinem Code jeden Umlaut durch __ ersetzen (2 Leerzeichen).

Problem dabei ist aber sicherlich auch, dass du mehrere Treffer bekommst.

T
433 Beiträge seit 2006
vor 17 Jahren

Weiss jetzt nicht ob du mich so richtig verstanden hast.

Also normalerweise schreibt ein unbedarfter Mensch (😉) entweder Umlaute oder er schreibt sie halt aus.
Soll heissen ein Datensatz wird denke ich mal nicht gemischt sein, sollte dies dennoch der Fall sein musst du dir über die Implementation eines Phonetischen Algorithmus Gedanken machen.
Aber normalerweise würde ich behaupten das mein Denkansatz in deinem Falle reicht.

Gruß,
Tom

Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren

Der _ als Platzhalter steht aber doch immer für genau ein Zeichen...
D.h. M__ller findet zwar Mueller, aber nicht Müller weil zu wenige Zeichen.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

D
462 Beiträge seit 2005
vor 17 Jahren

Hallo!

Warum wandelst du nicht einfach ALLE Umlaute in diesen Vergleichsstring in ue, ae, oe um?
Beispiel (Pseudo-Code)

SELECT * FROM Tabelle WHERE Replace(Name, 'ü', ue) = Replace('Müller', 'ü', ue)

mfg

Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren

Original von DeveloperX

SELECT * FROM Tabelle WHERE Replace(Name, 'ü', ue) = Replace('Müller', 'ü', ue)  

Sowas in die Richtung hab ich mir auch überlegt, aber dann müsste ich die Daten quasi dupliziert in einer "Such-Spalte" speichern (was ein ziemlich hohes Datenvolumen bedeuten würde), denn ein dynamisches Replace über >40 Mio. Datensätze ist kein Spass 😉

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

U
3 Beiträge seit 2007
vor 17 Jahren

Hm,

mal ganz naiv:

SELECT * FROM Tabelle WHERE name IN ('Müller', 'Mueller')

wobei Du Dir die IN-Klausel vorher in C# zusammenbaust?

Mr. Bart Simpson Themenstarter:in
502 Beiträge seit 2004
vor 17 Jahren

Das ist aber im Prinzip identisch mit dem Vorschlag von Tom, nur dass er OR's nutzen würde...

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

T
512 Beiträge seit 2006
vor 17 Jahren

Seien wir mal realistisch, es wird wohl eher wenige Namen mit mehr als 3 Umlauten geben. Daraus folgt, es gibt höchstens 8 Kombinationen. Das ringt der Datenbank auch nur ein Gähnen ab.

Die Variante mit dem IN erscheint mir aber besser als die ORs. Semantisch ist es natürlich das Gleiche, aber der Optimierer kann da doch ganz andere Sachen draus basteln.

e.f.q.

Aus Falschem folgt Beliebiges

U
3 Beiträge seit 2007
vor 17 Jahren

Original von Mr. Bart Simpson
Das ist aber im Prinzip identisch mit dem Vorschlag von Tom, nur dass er OR's nutzen würde...

Hast recht. Den Beitrag hatte ich irgendwie übersehen, sorry