如何在iReport查询中添加where语句,条件是列表不为空:
WHERE
CASE WHEN length($P{list}) > 0 THEN table_x.id IN ($P!{list}) END
我试图显示传递空列表的报告,但它不起作用。
答案 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})