我在WHERE子句中使用NVL函数,如下所示。
... AND NVL(FIRST_DATE, SECOND_DATE) BETWEEN (SYSDATE - 7) and SYSDATE 我所做的是这样的:如果FIRST_DATE为null,则使用SECOND_DATE进行比较。这样做的问题是它阻止了对列first_date或second_date使用索引。因此,我将条件重写为:
... AND
((FIRST_DATE BETWEEN (SYSDATE-7) AND SYSDATE)
OR
(FIRST_DATE IS NULL AND SECOND_DATE BETWEEN (SYSDATE-7) AND SYSDATE))我通过用不同的日期运行它来测试它,它总是返回与NVL函数相同的结果。但我想确保并检查我是否没有遗漏任何可能导致结果不同的异常。有人能确认我所做的在语义上等同于NVL函数吗?
发布于 2020-04-28 18:36:33
问题并不是NVL()本身。这只是WHERE子句的复杂性。Oracle支持表达式上的索引,因此我建议使用新的索引:
create index idx_t_dates on t(coalesce(first_date, second_date))然后,如果在where子句中使用相同的表达式,则应该使用索引:
and coalesce(first_date, second_date) between sysdate - 7 and sysdate与nvl()相比,我更喜欢coalesce(),因为它是具有相同功能的标准函数。
https://stackoverflow.com/questions/61477540
复制相似问题