java - Oracle Java - 将可选日期参数添加到准备好的语句中

标签 java oracle date prepared-statement optional-parameters

我想向准备好的语句添加可选的“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/

相关文章:

java - 自动装箱和性能

sql - 使用Alter命令的Oracle存储过程

database - 无法验证或授权 DBMS_JAVA

Oracle 删除并创建索引

java - 在MySQL中添加java日期时出现问题?

java - Java字节码和Kotlin字节码的区别

java - 如何在java中的soap header中添加子元素

java - 将对象重置为初始状态

bash - 使用舍入毫秒 Bash Shell 脚本从时间戳中获取格式化日期

python - 按日期对元组列表进行排序