我想向准备好的语句添加可选的“todate”参数
一种方法是为可选参数添加占位符并在执行之前替换它
where id=? OPTIONAL_SECTION
例如 OPTIONAL_SECTION 将设置为 TO_DATE <=sysdate -1
更好、更正确的方法是绑定(bind)可选参数并处理 null
where id=? and TO_DATE <= nvl(?, TO_DATE)
是否有更好的方法来处理可选的日期参数? 特别是因为条件可以不等于 ( TO_DATE < ?)
- 这是一个最小的示例,Id 不是主键(实际上是外键),SQL 返回多条记录
最佳答案
A better and correct way is to bind optional parameter with handling null
这不一定更好或更正确。这是一种不同的方式,但它是否“更好并且(更)正确”是非常有争议的。
SQL 查询优化器通常在任何 ?
之前运行参数值是已知的,因此 TO_DATE <= nvl(?, TO_DATE)
无法优化,并且需要全表扫描,除非 where
中的任何其他条件条款。
但是使用 TO_DATE <= ?
,优化器也许能够使用 TO_DATE
上的索引对索引进行范围扫描,因此我认为第一个选项可能更好,具体取决于可用索引。
condition can be without equal ( TO_DATE < ?)
第二个版本的正确编写方法是:
where id = ?
and (? is null or TO_DATE < ?)
当然,您必须为 PreparedStatement
指定两次值.
关于java - Oracle Java - 将可选日期参数添加到准备好的语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038191/