2017-01-09 3 views
3

Ich habe eine Abfrage:Wie kann ich "Variablen" WHERE-Klauseln in eine Abfrage einfügen?

SELECT * FROM table_name WHERE name=? surname=? gender=?;

und ich habe die Saiten in die Abfrage zu injizieren (verwende ich die vorbereitete Anweisung), aber das Problem ist, dass diese drei Klauseln sind variabel; Ich kann 0, 1 oder auch alle 3 Klauseln basierend auf der Eingabe, die der Benutzer macht, aktiv haben.

Wie kann ich jeden von ihnen "ignorieren", wenn der Benutzer nichts dafür eingibt?

Danke an alle!

EDIT: es ist auch gut, wenn jemand weiß, wie manStrin() zu einem preparedStatement setzt, ohne ihn ' ' um die Zeichenfolge setzen zu lassen.

+0

dynamisches SQL für den Gewinn. –

+0

Bereiten Sie alle sieben möglichen Kombinationen vor (8, wenn keine Klausel ebenfalls eine Option ist), oder erstellen Sie die Abfrage dynamisch. – RealSkeptic

+2

Mögliches Duplikat von [Vorbereitete Anweisung mit dynamischer Where-Klausel] (http://stackoverflow.com/questions/15405288/prepared-statement-with-dynamic-where-clause) – Berger

Antwort

3

Die einfachste Lösung sein wird Ihre vorbereitete Anweisung dynamisch, so etwas zu bauen:

String sql = "SELECT * FROM table_name"; 

if (nameInput != null || surnameInput != null || genderInput != null) 
{ 
    sql += " WHERE "; 
} 

if (nameInput != null) 
{ 
    sql += "name=? "; 
} 

Ich denke, die Idee zu den anderen Eingängen von dort bekommen.

Sie können dann den endgültigen Wert von sql in Ihren prepare Aufruf zusammen mit den Eingabewerten übergeben.

+0

Sorry, ich habe das [mysql] -Tag gesehen und meine Antwort in PHP reflexiv codiert. Ich hoffe, dass mein Java-Versuch in Ordnung ist (zumindest in dem Sinne, dass man es knacken kann). –

+0

aber auf diese Weise ist injizierbar! Ich möchte es verhindern (deshalb verwende ich preparedStatement mit der setString() –

+1

@ClaudioCiociola) Es ist nicht injizierbar, weil Sie das * Abfrage-Skelett * dynamisch erstellen, aber Sie fügen die Werte des Benutzers nur der vorbereiteten Anweisung hinzu – RealSkeptic

1

einfach ohne aufwendige oder teure Logik zu tun, in einer einzigen Zeile ...

Unter der Annahme, dass Ihre drei Variablen sind @name, @surname und @gender.

Auch vorausgesetzt, dass eine Zeichenfolge mit der Länge Null zur Verfügung gestellt wird, wenn ein Filter nicht benötigt wird.

Dann Select-Anweisung ist einfach:

select * from table_name where (name = @name or @name = '') and (surname = @surname or @surname = '') and (gender = @gender or @gender = '') 

das alles gibt es zu, es ist! Keine komplexe oder teure Logik.

Verwandte Themen