首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能重写NVL函数吗?

你能重写NVL函数吗?
EN

Stack Overflow用户
提问于 2020-04-28 18:01:15
回答 1查看 81关注 0票数 1

我在WHERE子句中使用NVL函数,如下所示。

代码语言:javascript
复制
... AND NVL(FIRST_DATE, SECOND_DATE) BETWEEN (SYSDATE - 7) and SYSDATE 

我所做的是这样的:如果FIRST_DATE为null,则使用SECOND_DATE进行比较。这样做的问题是它阻止了对列first_date或second_date使用索引。因此,我将条件重写为:

代码语言:javascript
复制
... AND 
((FIRST_DATE BETWEEN (SYSDATE-7)  AND SYSDATE) 
OR 
(FIRST_DATE IS NULL AND SECOND_DATE BETWEEN (SYSDATE-7) AND SYSDATE))

我通过用不同的日期运行它来测试它,它总是返回与NVL函数相同的结果。但我想确保并检查我是否没有遗漏任何可能导致结果不同的异常。有人能确认我所做的在语义上等同于NVL函数吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-28 18:36:33

问题并不是NVL()本身。这只是WHERE子句的复杂性。Oracle支持表达式上的索引,因此我建议使用新的索引:

代码语言:javascript
复制
create index idx_t_dates on t(coalesce(first_date, second_date))

然后,如果在where子句中使用相同的表达式,则应该使用索引:

代码语言:javascript
复制
and coalesce(first_date, second_date) between sysdate - 7 and sysdate

nvl()相比,我更喜欢coalesce(),因为它是具有相同功能的标准函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61477540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档