如何创建一个接受多个(CSV)值的BIRT数据集,它可以在select语句的"IN"子句中使用

Bun*_*Bun 1 birt reporting-services

我试图在BIRT报告中创建一个数据集,其中包含带有"IN"子句的select语句,并用逗号分隔值代替"?" 使用接受多个值的BIRT参数.

例如:select*from table where ID in(?)

我尝试在我的数据集"select*from table in where in in(params ["paramer_name"].value)"中添加此项,但它无效.

我不想使用内置的BIRT数据集过滤器,因为在查询中使用"IN"子句可以在我的数据库服务器中大大降低查询成本.

有没有一个简单的方法来做同样的事情而不添加长java脚本???

仅供参考:用户选择的参数列表来自另一个数据集,我想将所选值用作另一个数据集的输入.

非常感谢你的帮助...

Dom*_*que 6

我们不能使用常规SQL参数'?'来执行此操作.

解决方法是替换这个'?' 通过查询中的默认值,并在数据集的"beforeOpen"脚本中动态注入相应的逗号分隔值列表:

默认查询

假设ID的数据类型是一个整数,请像这样设置查询(当然这里使用有效的ID来预览数据):

select * from table where ID in ( 1000 )
Run Code Online (Sandbox Code Playgroud)

数据集的"beforeOpen"脚本:

   this.queryText=this.queryText.replaceAll('1000',params["parameter_name"].value.join(","));
Run Code Online (Sandbox Code Playgroud)

这样,如果"parameter_name"返回3个值1100,1200,1300,则发送到数据库的查询将是:

select * from table where ID in ( 1100,1200,1300)
Run Code Online (Sandbox Code Playgroud)

如果ID的数据类型是String,则类似,我们只需要使用引号进行一些操作.但是对于String类型,这种处理使得SQL注入攻击成为可能,我们首先应该检查参数值是否与我们期望的一样.