W rzeczywistości widziałem tego rodzaju rzeczy używane w raportach BIRT. Zapytanie przekazane do środowiska wykonawczego BIRT ma postać:
select a,b,c from t where a = ?
i „?” w czasie wykonywania jest zastępowany rzeczywistą wartością parametru wybraną z rozwijanego pola. Opcje w menu rozwijanym są podane przez:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
aby uzyskać wszystkie możliwe wartości plus „ *
”. Jeśli użytkownik wybierze „ *
” z listy rozwijanej (co oznacza, że należy wybrać wszystkie wartości a), zapytanie musi zostać zmodyfikowane (przez Javascript) przed uruchomieniem.
Od „?” jest parametrem pozycyjnym i MUSI pozostać tam, aby działały inne rzeczy, JavaScript modyfikuje zapytanie tak, aby było:
select a,b,c from t where ((a = ?) or (1==1))
To w zasadzie usuwa efekt klauzuli where, jednocześnie pozostawiając parametr pozycyjny na miejscu.
Widziałem także przypadek AND używany przez leniwych programistów podczas dynamicznego tworzenia zapytania SQL.
Załóżmy, że musisz dynamicznie utworzyć zapytanie, które zaczyna się select * from t
i sprawdza:
- nazywa się Bob; i
- wynagrodzenie wynosi> 20 000 $
niektórzy dodaliby pierwszą z GDZIE, a kolejną z AND:
select * from t where name = 'Bob' and salary > 20000
Leniwi programiści (i to niekoniecznie zła cecha) nie rozróżnią dodanych warunków, zaczną od select * from t where 1=1
i po prostu dodadzą klauzule AND.
select * from t where 1=1 and name = 'Bob' and salary > 20000