我正在使用 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 应用程序发送参数时不是明智的选择,需要考虑很多因素。 等待你的建议。
答案 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
可能需要一些时间,而不是联合。