我正在尝试在BIRT报告中创建一个包含带有“IN”子句的select语句的数据集,并用逗号分隔值代替“?”使用接受多个值的BIRT参数。
例如:select * from table in where in(?)
我尝试在我的数据集中添加这个“select * from table in where in(params [”paramer_name“]。value)”但它不起作用。
我不想使用内置的BIRT数据集过滤器,因为在查询中使用“IN”子句可以在我的数据库服务器中大大降低查询成本。
有没有一种简单的方法可以在不添加长java脚本的情况下做同样的事情???
仅供参考:用户选择的参数列表来自另一个数据集,我想将所选值用作另一个数据集的输入。
非常感谢你的帮助......
答案 0 :(得分:6)
我们不能使用常规SQL参数'?'来执行此操作。
解决方法是替换这个'?'通过查询中的默认值,并在数据集的“beforeOpen”脚本中动态注入相应的逗号分隔值列表:
默认查询
假设ID的数据类型是一个整数,请像这样设置查询(当然这里使用有效的ID来预览数据):
select * from table where ID in ( 1000 )
“beforeOpen”数据集的脚本:
this.queryText=this.queryText.replaceAll('1000',params["parameter_name"].value.join(","));
这样,如果“parameter_name”返回3个值1100,1200,1300,则发送到数据库的查询将是:
select * from table where ID in ( 1100,1200,1300)
如果ID的数据类型是String,则类似,我们只需要用引号播放一下。但是对于String类型,这种处理使得SQL注入攻击成为可能,我们首先应该检查参数值是否与我们期望的一样。