实际上,我已经在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
并检查的查询:
有些人会在第一个添加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