当参数未传递给报表时,如何在查询中禁用where子句?

时间:2014-05-27 09:43:06

标签: sql jasper-reports

我正在使用 iReport 设计 JasperReports 报告,我的查询是这样的:

select * from TABLE_NAME where COLUMN_NAME = $P{PARAMETER_NAME}

我的问题在我尝试使其成为通用时启动,即当未传递参数时,我希望查询从表中获取所有数据而不进行过滤。 我试图将参数的默认值设置为"all(PARAMETER_NAME)",但这仅在引用带$P!{PARAMETER_NAME}的参数时有效,这意味着参数值将被视为查询的一部分,因此查询变为< / p>

select * from TABLE_NAME where COLUMN_NAME = $P!{PARAMETER_NAME}

但是在这种情况下,参数必须不作为SQL查询传递或传递,这在从 Java 应用程序发送参数时不是明智的选择,需要考虑很多因素。 等待你的建议。

3 个答案:

答案 0 :(得分:3)

我发现我可以通过以下方式实现:

select * from TABLE_NAME where COLUMN_NAME = $P{PARAMETER_NAME} or $P{PARAMETER_NAME} is NULL

如果有更好的建议请提供。

答案 1 :(得分:1)

试试这个:它特定于oracle,但适用于您提到的情况 SELECT * FROM TABLE_NAME TM WHERE (CASE WHEN $P!{PARAMETER_NAME} IS NULL THEN 'TRUE' ELSE (DECODE(TM.COLUMN_NAME, '1001', 'TRUE', 'FALSE')) END) = 'TRUE'; 首先,如果检查&#39; $ P!{PARAMETER_NAME}是空的&#39;失败并且它移动到ELSE部分并且根据匹配,它返回值。

SELECT * FROM TABLE_NAME TM WHERE (CASE WHEN $P!{PARAMETER_NAME} IS NULL THEN 'TRUE' ELSE (DECODE(TM.COLUMN_NAME, '1001', 'TRUE', 'FALSE')) END) = 'TRUE'; case语句决定是否要检查参数。如果它等于NULL,它将返回TRUE,它将在等号后与TRUE匹配并返回所有记录。

您可以使用case语句而不是DECODE SELECT * FROM TABLE_NAME TM WHERE (CASE WHEN '1001' IS NULL THEN 'TRUE' ELSE (CASE WHEN TM.COLUMN_NAME = '1001' THEN 'TRUE' ELSE 'FALSE' END) END) = 'TRUE';

答案 2 :(得分:1)

我认为使用UNION运算符就足够了。例如:

select * from TABLE_NAME where COLUMN_NAME = $P!{PARAMETER_NAME} and $P!{PARAMETER_NAME} is not null
union
select * from TABLE_NAME

这意味着,如果没有第一个块的标准(在这种情况下,当未输入参数时,它将具有空值),那么它将执行第二个块,没有where子句的那个。请记住,使用UNION ALL可能需要一些时间,而不是联合。