如何在报表查询中有条件地在列表中添加where语句?

时间:2017-09-28 09:38:56

标签: sql jasper-reports

如何在iReport查询中添加where语句,条件是列表不为空:

WHERE
CASE WHEN length($P{list}) > 0 THEN table_x.id IN ($P!{list}) END

我试图显示传递空列表的报告,但它不起作用。

3 个答案:

答案 0 :(得分:1)

Jasper报告有自己的query system,我认为你的$P{list}是一个扩展java.util.Collection的类,例如java.util.List,因为你声明“传递一个空列表”

要在jasper报告中的IN上创建预备语句 Collection查询,请使用:

WHERE $X{IN, table_x.id, list}

请注意,如果列表为null或列表为空,则此查询将返回所有记录,请参阅using-parameters-queries

  

JasperReports处理每个值中的特殊字符。如果参数为null或包含空列表,意味着没有为参数设置任何值,则整个$ X {}子句将被计算为always true语句“0 = 0”。

为了不显示任何记录,在将参数传递给jasper-report之前,需要向java中的null添加至少一个List值。

if (list.isEmpty()){
    list.add(null);
}

请注意,您应该避免使用$P!{param},因为这会创建 一个sql通过字符串连接打开你的应用程序到SQL注入攻击,总是尝试使用预处理语句。

答案 1 :(得分:0)

如果我理解正确,请尝试使用:

WHERE (CASE WHEN length($P{list}) > 0 THEN table_x.id IN ($P!{list}) END) <> ''

答案 2 :(得分:0)

您的ELSE子句是NULL,这是错误的。我建议避免使用CASE

WHERE length($P{list}) = 0 OR table_x.id IN ($P!{list})