Dan*_*ses 7 sql jasper-reports where-clause
假设我想要一个JasperReport,让用户可以根据需要过滤日期.SQL如下:
select * from foo where bar = $P{bar} and some_date > $P{some.date}
Run Code Online (Sandbox Code Playgroud)
现在,如果他们没有通过日期,我不想按某个日期过滤.我发现以下人们使用的kludge:
select * from foo where bar = $P{bar} $P!{some.date.fragment}
Run Code Online (Sandbox Code Playgroud)
并且some.date.fragment参数使用以下默认值定义:
($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'"
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为toString不以我的SQL服务器理解的格式输出日期.我想条件仍然使用jdbc驱动程序的预准备语句并输入参数,我只是希望准备好的语句依赖于参数是否为null.可以这样做吗?
在使用$P!{}表达式之前,JDBC-Driver会为您执行所有格式化.
但是如果你使用$P!{}表达式,你必须格式化自己.
这样的事情应该有效:
(
$P{some.date} == null
?
""
:
"AND some_date >'" + (new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS")).format($P{some.date}) + "'"
)
Run Code Online (Sandbox Code Playgroud)
根据您的数据类型,您必须自定义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)
Run Code Online (Sandbox Code Playgroud)
现在您可以查询:
SELECT
*
FROM foo
WHERE
bar = $P{bar}
AND
(
some_date > $P{some.date}
OR 1 = $P{is_null_pram}
)
Run Code Online (Sandbox Code Playgroud)