如果输入为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)
}
谢谢大家的帮助