PostgreSQL SELECT Statement

unavailable

Mitglied
Hey ho Freunde,

ich hab da wieder mal ein Problem.
In meinem Adressbuch gibt's nen JTextField was den String der bei .getText()
zurückkommt, an eine Methode schickt, die in der Datenbank alles herausfiltern soll, was zu dem
angegebenen Wort passt.

Wie muss ich da jetzt das SQL Statement aufbauen?

Mir fällt nur ein [c]SELECT * FROM database WHERE username = 'searchedFor' OR vorname='searchedFor'[/c].. Aber das ist nicht die sauberste Lösung und vorallem unperformant.
 
die in der Datenbank alles herausfiltern soll, was zu dem
angegebenen Wort passt.

Mir fällt nur ein [c]SELECT * FROM database WHERE username = 'searchedFor' OR vorname='searchedFor'[/c].. Aber das ist nicht die sauberste Lösung und vorallem unperformant.

Warum musst du denn die ganze Datenbank (alle Tabellen und alle Spalten) durchsuchen?
Ich gehe mal davon aus das du ein Suchfeld hast das für dein ganzes Programm gilt und somit alles mögliche finden kann/soll. Eine allg globale Lösung die DB zu durchsuchen kenne ich nicht und kann es meiner Meinung nach auch nicht geben.

Das Problem liegt ja auch daran, was für Daten willst du zurückbekommen?
Jede Tabelle hat eine andere Struktur. Du müsstest min jede Tabelle einzeln durchgehen!
 
Es gibt 3 Fenster:
- Ein Login für's allgemeine Programm
- Ein Login für das Adressbuch, um seine eigenen Daten einzutragen
- Das Adressbuch

Wenn man im Adressbuch ist, gibt es ein Suchfeld, welches die Datenbank (welche aus einer Tabelle besteht mit 8 Spalten) nach dem gesuchten Wort absuchen soll.
Die resultierenden Werte sollen in einem Vector (bzw. einer beliebigen Collection) gespeichert werden und an eine Methode gesendet werden, die daraus eine Tabelle baut, welche dem User angezeigt werden soll.

Nun möchte ich aber nicht alle 8 Spalten abfragen, ob das Wort existiert, weil ich mir sicher bin das da noch einige Spalten dazu kommen. D.h. Erweiterbarkeit ist schlecht umgesetzt.

Gibt es keine WHERE Bedingung, die mir ALLES zurückgibt, die mit dem gesuchten Wort zusammen passt?
Code:
SELECT * FROM users WHERE InhaltDerDatenbank LIKE %gesuchtesWort%
 
Wenn man im Adressbuch ist, gibt es ein Suchfeld, welches die Datenbank (welche aus einer Tabelle besteht mit 8 Spalten) nach dem gesuchten Wort absuchen soll
.........
Nun möchte ich aber nicht alle 8 Spalten abfragen, ob das Wort existiert, weil ich mir sicher bin das da noch einige Spalten dazu kommen. D.h. Erweiterbarkeit ist schlecht umgesetzt.

Das stimmt natürlich das bei neuen Spalten viel zu ändern ist.

Gibt es keine WHERE Bedingung, die mir ALLES zurückgibt, die mit dem gesuchten Wort zusammen passt?
Code:
SELECT * FROM users WHERE InhaltDerDatenbank LIKE %gesuchtesWort%

Nein gibt es nicht. Aber du kannst dir die Metadaten der Tabelle abfragen. Dort bekommst du die Information zu den vorhadenen Spalten. Dann musst du nur noch dein
Code:
SELECT
dynamisch zusammenbauen.
 
Ich wüsste auch keine andere Lösung als das dynamische erstellen der WHERE-Klausel.

Viel interessanter ist aber doch, wieso das überhaupt benötigt wird...
Wenn der Nutzer einen Suchbegriff eingibt, dann weiß er doch so halbwegs wonach er suchen möchte.
Wieso möchtest du dem Nutzer nicht direkt die Möglichkeit bieten seine Suche einzugrenzen? Also nicht nur ein Textfeld anbieten sondern eben mehrere?
Das ist weitaus performanter und der Nutzer wird es dir mit Sicherheit danken!
 
Man kann mit den Metadaten auch in SQL selbst Funktionen für soetwas realisieren. Hier beispielsweise eine Funktion die sowohl alle Tabellen als auch deren Spalten nach einem Wert durchsucht How to search a specific value in all tables (PostgreSQL)? - Stack Overflow (Antwort von Daniel Vérité)

Das könnte man dann im Prinzip so umstricken, dass nur bei einer Tabelle alle Spalten durchlaufen werden und ggf. Systemspalten wie Primärschlüssel unberücksichtigt bleiben. Dass das ganze aber richtig böse in die Performance gehen kann, sollte klar sein.
 

Zurück
Oben