JasperReports中的条件Where子句

时间:2012-09-07 20:08:11

标签: sql jasper-reports where-clause

假设我想要一个JasperReport,让用户可以根据需要过滤日期。 SQL如下:

select * from foo where bar = $P{bar} and some_date > $P{some.date}

现在,如果他们没有通过日期,我不想按某个日期过滤。我找到了以下人们使用的kludge:

select * from foo where bar = $P{bar} $P!{some.date.fragment}

使用以下默认值定义some.date.fragment参数:

($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'"

这不起作用,因为toString不以我的SQL服务器理解的格式输出日期。我想让条件仍然使用带有jdbc驱动程序的预准备语句并将参数输入,我只是希望准备好的语句依赖于参数是否为null。可以这样做吗?

3 个答案:

答案 0 :(得分:6)

在使用$P!{}表达式之前,JDBC-Driver会为您执行所有格式化。

但是如果你使用$P!{}表达式,你必须格式化自己。

这样的事情应该有效:

(
$P{some.date} == null 
? 
"" 
: 
"AND some_date >'" + (new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS")).format($P{some.date}) + "'"
)

根据您的数据类型,您必须自定义dd.MM.yyyy HH:mm:ss.SSS

如果您不想使用$P!{}表达式,可以使用下面的解决方案来避免它。

我个人不喜欢这样。它也可能导致糟糕的执行计划。

如果不想使用$P!{}因为你担心sql注入。只要您的参数$P{some.date}包含java.lang.Date等安全数据类型,就不用了。


创建参数。我们称之为${is_null_pram}并添加一个带有参数类Integer的默认表达式:

($P{some.date} == null ? 1 : 0)

现在您可以查询:

SELECT 
    * 
FROM foo 
WHERE
    bar = $P{bar}
    AND
        (
            some_date > $P{some.date}
            OR 1 = $P{is_null_pram}
        )

答案 1 :(得分:1)

我认为你可以使用这个功能:

$X{EQUAL, <column_name>, <parameter_name>}

它可以优化查询,您可以在this帮助页面中看到。

答案 2 :(得分:0)

您可以使用此条件语句

    select * 
    from foo 
    where bar = $P{bar} and some_date > $P{some.date} or $P{some.date}  is null