【问题标题】:instead of between can we do something better我们能不能做得更好而不是介于两者之间
【发布时间】:2021-09-28 14:32:50
【问题描述】:

我们在查询中使用下面的condition

AND TRUNC(SYSDATE) BETWEEN NVL( pap.effective_start_date, SYSDATE - 1 ) 
                       AND NVL( pap.effective_end_date, SYSDATE + 1 )

如何在不使用BETWEEN 的情况下重写查询?

【问题讨论】:

  • 一种“更好”的方法是使用 (+) 放弃专有的外部连接,甚至 Oracle 也推荐。但是使用>= < 通常更适合日期/时间值,但由于您需要coalesce(),因此即使使用它也不可能使用索引。
  • 你肯定会删除。你能建议介于两者之间吗?
  • 删除between 想要达到什么目的。如前所述,coalesce 将禁用索引/分区访问,因此任何转换都不会提供任何改进

标签: sql oracle oracle11g oracle12c


【解决方案1】:

如果你只关心代码编写,那你一定可以试试下面的代码-

AND TRUNC(SYSDATE) >= NVL( pap.effective_start_date, SYSDATE - 1 )
AND TRUNC(SYSDATE) <= NVL( pap.effective_end_date, SYSDATE + 1 )

【讨论】:

  • 每个任务都应该有一个目的。这个问题没有说明目的。因此,同样有效的答案是任何常量 true 甚至语义常量 true 添加到这个条件。
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 2019-05-18
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多