Suchalgorithmus

Alex_winf01

Top Contributor
Hallo liebe Forengemeinde,

folgende Anfrage: Ich habe ein kleines Such-Fenster implementiert mit mehreren Textfeldern (Name, Vorname, Geb. usw.). Aufgrund der eingegebenen Werte wird in der Datenbank gesucht. Die Suche dauert jetzt aber ewig. Derzeit ist die Suche so gestaltet, dass abgeprüft wird, welche Felder vom Anwender gefüllt wurden. Hierzu werden dann Hilfsvariablen auf true oder false gesetzt. In mehreren while-Schleifen hintereinander wird abgeprüft, welcher Fall vorliegt und der select-Befehl wird entsprechend zusammengesetzt und ausgeführt. Diese Vorgehensweise war intern vorgegeben, ist aber leider total ineffizient.

Wie würdet ihr einen effizienten Such-Algorithmus umsetzen? Beispiel: Anwender gibt Name und Vorname ein muss genauso funktionieren, als wenn der Anwender nur das Geb.-Datum oder nur den Vornamen oder nur den Namen oder sogar Name, Vorname, Geb. eingibt. Für jede Anregung bin ich dankbar.
 

XHelp

Top Contributor
Was machst du denn in den while-Schleifen? Irgendwie kann ich mir nichts ausdenken, wo du für Auswertung von 3-boolean-Variablen a) while-Schleifen und b) jede menge Zeit brauchst.
Du könntest auch einfach nur mit LIKE arbeiten:
SQL:
SELECT * FROM db WHERE vorname LIKE '%?%' AND nachname LIKE '%?%'
Die Fragezeichen ersetzt du durch die jeweiligen Eingaben. Wenn die Eingabe leer ist, dann steht im Endeffekt '%%' da, was dazu führt, dass alle (bis auf null) Felder genommen werden.
 
H

Herr K.

Gast
Hallo,

ich stimme mal XHelp zu, eine While-Schleife solltest Du nicht brauchen, erst recht nicht mehrere.

Was Dein Problem mit den ausgefüllten Feldern angeht, setz einfach Deinen Suchstring dynamisch zusammen:

Java:
boolean isFirst = true;
final StringBuilder sb = new StringBuilder("SELECT * FROM tableX");

if (vorname != null && !vorname.isEmpty()) {
  if (isFirst) {
    sb.append("WHERE vorname LIKE '%'"+ vorname +  "%'");
    isFirst = false;
  }
  else {
    sb.append("AND vorname LIKE '%'"+ vorname +  "%'");
  }
  isFirst = false;
}

Das ganze solltest Du schöner machen und DRY befolgen (also z.B. die Abfrage mit dem isFirst in eine eigene Methode packen, die eben was anhängt, aber so vom Prinzip sollte das so klar sein.
 

Landei

Top Contributor
Wenn man die Anzahl Kriterien nicht kennt, ist ein alter Trick, mit [c]"... WHERE 1=1 "[/c] zu beginnen. Dann kann man je nach Bedarf Sachen wie [c]" AND vorname = 'A%'"[/c] oder [c]" AND nachname = 'Z%'"[/c] anfügen, ohne sich darum kümmern zu müssen, ob das nun das erste Kriterium ist, oder nicht. Moderne SQL-Engines optimieren das [c]1=1[/c] weg.
 

Ähnliche Java Themen

Neue Themen


Oben