与NULL和使用NVL函数相比,哪个更好

  • 本文关键字:更好 函数 NULL NVL sql oracle
  • 更新时间 :
  • 英文 :


如果输入为NULL,那么哪种方法更好地获得所有条目的输出,或者当输入为NOT NULL时获得特定记录?这是针对Oracle数据库上的PL/SQL。如果我的第一个方法错误,请告诉我

select * from student where (roll_no = :ROLL_NO or :ROLL_NO is NULL);

select * from student where roll_no = NVL(:ROLL_NO, roll_no);

roll_no为空的情况下,这两种方法将给出不同的结果,因为roll_no = roll_no对于这些行将不为真。

如果有索引,则优化器对somecol = nvl(:param,somecol)有一个特殊情况,并且您将在执行计划中看到两个FILTER操作和一个CONCATENATION,表示:param为null或不为null的情况。因此,只要roll_no被定义为NOT NULL列,我就会使用nvl表达式。

通常,使用运算符是一种更好的方法。这是因为当列不是函数的参数时,优化器会更聪明。

这个答案假定roll_no不是null

尽管Oracle优化器有时会遇到这种情况,但您可能会发现,当存在适当的索引时,使用union all编写查询实际上会产生更好的执行计划:

select s.*
from student s
where roll_no = :ROLL_NO
union all
select s.*
from student s
where :ROLL_NO is NULL;

Seconds方法只需少量修改(无法将null与null进行比较(即可得到相同的结果:

select * from student where NVL(roll_no,1) = NVL(NVL(:ROLL_NO, roll_no),1);

William Robertson提出了一个很好的观点。那时我明白了自己的错误。我试着回答Gordon linoff的问题。它奏效了。我认为瓦尔德莫特的答案也是正确的,但我没有尝试

下面的答案是我的解决方案,可能与瓦尔德莫特的答案类似。

select * from student where AND (roll_no = nvl(roll_no,1) = nvl(:roll_no,1)

谢谢大家的帮助

最新更新