有条件的Where子句中的JasperReports(Conditional Where claus

2019-07-31 10:22发布

比方说,我希望有一个JasperReport的,让用户过滤器上的日期,如果他们愿意的话。 在SQL如下:

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

现在,我不希望被某些日期进行过滤,如果他们没有通过的日期在我发现下面的杂牌人们使用:

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驱动程序和折腾的参数,我只是想准备的语句是依赖于如果该参数为空或不是。 可以这样做?

Answer 1:

之前你已经使用了$P!{}表达的JDBC驱动程序做的所有格式为您服务。

但是,如果你使用$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}并添加与PARAM类默认表情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}
        )


Answer 2:

我想你可以使用的功能:

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

它优化了查询,你可以在看到此帮助页面。



Answer 3:

您可以使用此条件语句

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


文章来源: Conditional Where clauses in JasperReports