1

我正在尝试在 BIRT 报告中创建一个数据集,该数据集包含一个带有“IN”子句的选择语句,并传递一个逗号分隔值来代替“?” 使用接受多个值的 BIRT 参数。

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

我尝试将其添加到我的数据集中“从 ID 在(params [“paramer_name”].value)中的表中选择*”但它不起作用。

我不想使用内置的 BIRT 数据集过滤器,因为在查询中使用“IN”子句可以在很大程度上降低我的数据库服务器中的查询成本。

有没有一种简单的方法可以在不添加长 java 脚本的情况下做同样的事情???

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

非常感谢你的帮助...

4

1 回答 1

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 注入攻击成为可能,我们应该首先检查参数值是否符合我们的预期。

于 2013-09-04T08:14:03.187 回答