Wie erstellt man eine SQL-statement mit mehreren Suchbegriffen, in der alle Parameter optional sind?

Ich würde gerne wissen, ob es eine kluge Möglichkeit gibt, eine SQL-statement für eine Suchmaschine zu machen, wo es 5 optionale Parameter gibt. Alle Parameter können verwendet werden oder nur einer von ihnen, oder eine Mischung von irgendwelchen von ihnen. Dies macht bis zu 3000+ verschiedene Kombinationen.

Die statement muss vorbereitet sein, um SQL-Injektionen zu vermeiden.

Ich habe mir diesen Post angeschaut, aber er ist ziemlich geschnitten.

Nach was ich suche ist etwas wie,

String sql = SELECT * FROM Tabelle WHERE (optional1) =? UND (optional2) =? UND (optional3) =? UND (optional4) =? UND (optional5) =?

prepared.setString (1, optional1) und so weiter …

Verwenden Sie Ihren Java-Code, um die Optionen der where-Klausel basierend auf dem Vorhandensein Ihrer Argumente (Länge oder Existenz, je nachdem) hinzuzufügen. Wenn der optionale Parameter nicht benötigt wird, ist er nicht einmal Teil Ihres SQL-Ausdrucks. Einfach.

Ich glaube, es sollte funktionieren (noch nicht getestet)

 SELECT * FROM table WHERE field1 = CASE WHEN ? IS NULL THEN field1 ELSE ? END AND field2 = CASE WHEN ? IS NULL THEN field2 ELSE ? END AND .... etc //java code if ([optional1 is required]) { prepared.setString(1, optional1) ; prepared.setString(2, optional1) ; } else { prepared.setNull(1, java.sql.Types.VARCHAR) ; prepared.setNull(2, java.sql.Types.VARCHAR) ; } 

etc.

@ a1ex07 hat die Antwort gegeben, dies als eine einzige Abfrage zu tun. NULL verwenden und in jeder Bedingung nach ihnen suchen.

 WHERE table.x = CASE WHEN @x IS NULL THEN table.x ELSE @x END 

oder…

 WHERE (@x IS NULL OR table.x = @x) 

oder…

 WHERE table.x = COALESCE(@x, table.x) 

usw. usw.

Es gibt jedoch eine Warnung; So bequem wie es ist, eine Abfrage zu machen, um all dies zu tun, sind all diese Antworten suboptimal. Oft sind sie horednous.

Wenn Sie eine Abfrage schreiben, wird nur ein Ausführungsplan erstellt. Und dieser ONE-Ausführungsplan muss für ALLE möglichen Wertekombinationen geeignet sein. Aber das behebt, welche Indizes durchsucht werden, nach welcher Reihenfolge sie durchsucht werden, usw. Es ergibt den Plan mit dem geringsten Fehler für eine Abfrage, die für alle passt.

Stattdessen fügen Sie die Bedingungen nach Bedarf hinzu. Sie parametrisieren sie immer noch, aber Sie enthalten keine Bedingung, wenn Sie wissen, dass der Parameter NULL ist.

Dies ist ein guter Link, der es weiter erklärt, es ist speziell für MS SQL server, aber es ist generell für jedes RDBMS anwendbar, das die Pläne zwischenspeichert, nachdem es das SQL kompiliert hat.

http://www.sommarskog.se/dyn-search.html