gpt4 book ai didi

sql - JasperReports 中的条件 Where 子句

转载 作者:行者123 更新时间:2023-12-04 11:56:02 28 4
gpt4 key购买 nike

假设我想要一个 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 驱动程序的准备好的语句并将参数折腾进去,我只希望准备好的语句依赖于参数是否为空。这可以做到吗?

最佳答案

在您使用 $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注入(inject)。只要你的参数 $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}
)

关于sql - JasperReports 中的条件 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12324706/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com