为什么在WHERE子句中使用NVL(Oracle)

时间:2019-02-25 17:21:44

标签: sql oracle nvl

我反复看到类似的查询:

select count(*) 
from some_table
where nvl(some_column,'N') = 'Y';

some_column('Y', 'N', null)中取值。

是否有理由使用它而不是以下内容?

select count(*) 
from some_table
where some_column = 'Y';

在我尝试过的几个示例中,似乎没有任何性能优势,并且在某些情况下,第一个查询的速度较慢。

谢谢。

1 个答案:

答案 0 :(得分:0)

我也经常看到这一点。开发人员很可能已经习惯在nvl表达式中包装可为空的列,这可能是在过去被意外的null值烧掉之后,现在将其添加到任何地方而无需费心思考,或者可能没有首先真正了解了这个问题。

这将防止在基础列上使用任何索引,分区修剪或直方图(尽管优化器的自适应功能可能会生成动态直方图来对此进行校正)。

例如,如果您想将null视为不是“ Y”,则在检查表达式具有某些特定值的情况下,可能需要这种构造。也许开发人员正在考虑这一点。