实际上,我在BIRT报告中看到过这类东西。传递给BIRT运行时的查询是这样的:
select a,b,c from t where a = ?
还有'?'在运行时被从下拉框中选择的实际参数值替换。下拉菜单中的选项是:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
这样你就得到了所有可能的值加上*。如果用户从下拉框中选择了“*”(意味着a的所有值都应该被选中),在运行查询之前必须修改(通过Javascript)。
因为"?"是一个位置参数,必须保持在那里以便其他东西工作,Javascript将查询修改为:
select a,b,c from t where ((a = ?) or (1==1))
这基本上消除了where子句的影响,同时仍然保留位置参数。
我还见过懒惰的程序员在动态创建SQL查询时使用AND大小写。
比如你必须动态创建一个以select * from t开头的查询,并检查:
我的名字叫鲍勃;而且
薪水是2万美元
有些人会在第一个单词后面加上WHERE,然后在后面的单词后面加上and,这样:
select * from t where name = 'Bob' and salary > 20000
懒惰的程序员(这并不一定是一个坏特性)不会区分添加的条件,他们会从select * from t where 1=1开始,然后在后面添加and子句。
select * from t where 1=1 and name = 'Bob' and salary > 20000