实际上,我已经在 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