In realtà, ho visto questo genere di cose usate nei rapporti BIRT. La query passata al runtime BIRT è nel formato:
select a,b,c from t where a = ?
e il '?' viene sostituito in fase di esecuzione da un valore di parametro effettivo selezionato da una casella a discesa. Le scelte nel menu a discesa sono fornite da:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
in modo da ottenere tutti i valori possibili più " *
". Se l'utente seleziona " *
" dalla casella a discesa (ovvero tutti i valori di a devono essere selezionati), la query deve essere modificata (da Javascript) prima di essere eseguita.
Dal momento che il "?" è un parametro posizionale e DEVE rimanere lì affinché altre cose funzionino, Javascript modifica la query in modo che sia:
select a,b,c from t where ((a = ?) or (1==1))
Ciò sostanzialmente rimuove l'effetto della clausola where, lasciando comunque in atto il parametro posizionale.
Ho anche visto il caso AND utilizzato dai programmatori pigri durante la creazione dinamica di una query SQL.
Supponi di dover creare dinamicamente una query che inizia con select * from t
e verifica:
- il nome è Bob; e
- lo stipendio è> $ 20.000
alcune persone aggiungerebbero la prima con un WHERE e le successive con un AND quindi:
select * from t where name = 'Bob' and salary > 20000
I programmatori pigri (e questo non è necessariamente un tratto negativo ) non distinguerebbero tra le condizioni aggiunte, inizierebbero select * from t where 1=1
e aggiungerebbero solo clausole AND.
select * from t where 1=1 and name = 'Bob' and salary > 20000