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

Why use NVL in WHERE clause (Oracle)

我反复看到类似于以下内容的查询:

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';

从我试过的几个例子来看,似乎没有任何性能优势,而且在少数情况下第一个查询速度较慢。

提前致谢。

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

这将阻止在基础列上使用任何索引、分区修剪或直方图(尽管优化器的自适应功能可能会生成动态直方图来纠正这一点)。

在检查表达式 not 是否具有某些特定值的情况下,如果您想将 null 视为非 [=19],则可能需要这种构造=] 例如。或许开发者就是这么想的。