Eigentlich habe ich so etwas in BIRT-Berichten gesehen. Die an die BIRT-Laufzeit übergebene Abfrage hat folgende Form:
select a,b,c from t where a = ?
und das '?' wird zur Laufzeit durch einen tatsächlichen Parameterwert ersetzt, der aus einem Dropdown-Feld ausgewählt wurde. Die Auswahlmöglichkeiten in der Dropdown-Liste sind wie folgt:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
damit Sie alle möglichen Werte plus " *
" erhalten. Wenn der Benutzer " *
" aus dem Dropdown-Feld auswählt (dh alle Werte von a sollten ausgewählt werden), muss die Abfrage (von Javascript) geändert werden, bevor sie ausgeführt wird.
Seit der "?" ist ein Positionsparameter und MUSS dort bleiben, damit andere Dinge funktionieren. Das Javascript ändert die Abfrage wie folgt:
select a,b,c from t where ((a = ?) or (1==1))
Dadurch wird der Effekt der where-Klausel im Wesentlichen beseitigt, während der Positionsparameter weiterhin beibehalten wird.
Ich habe auch den AND-Fall gesehen, der von faulen Codierern beim dynamischen Erstellen einer SQL-Abfrage verwendet wird.
Angenommen, Sie müssen dynamisch eine Abfrage erstellen, die mit Folgendes beginnt select * from t
und Folgendes überprüft:
- der Name ist Bob; und
- Das Gehalt beträgt> 20.000 US-Dollar
Einige Leute würden das erste mit einem WO und die nachfolgenden mit einem UND hinzufügen, also:
select * from t where name = 'Bob' and salary > 20000
Faule Programmierer (und das ist nicht unbedingt eine schlechte Eigenschaft) würden nicht zwischen den hinzugefügten Bedingungen unterscheiden, sie würden damit beginnen select * from t where 1=1
und danach einfach AND-Klauseln hinzufügen.
select * from t where 1=1 and name = 'Bob' and salary > 20000