[英]Difference between NVL and OR in SQL oracle
嘿伙计们,有人可以在下面的查询中向我解释 NVL() 和 OR 之间的区别吗:
Select
count(*)
from SHIPMENTSTATUS
WHERE insert_date between trunc(sysdate) -2 and trunc(sysdate) -1 or update_date BETWEEN trunc(sysdate) -2 and trunc(sysdate) -1
行数: 44937
和
Select
count(*)
from SHIPMENTSTATUS
where NVL(UPDATE_DATE, INSERT_DATE) between trunc(sysdate) -2 and trunc(sysdate) -1
行数: 44782
为什么我们有这种差异:155 行? 我基于 nvl 构建了一些查询并注意到该问题并要切换到OR
,但我真的很想知道,为什么会有如此大的差异。 谢谢你的解释
当UPDATE_DATE
不为空NVL(UDATE_DATE, INSERT_DATE)
评估为UPDATE_DATE
并且INSERT_DATE
根本不会被使用。 INSERT_DATE
在范围内,但在该范围之外的非空UPDATE_DATE
的记录将包含在第一个查询中,但在第二个查询中排除。
第一个条件表达式检查两列中的任何一列是否在目标日期范围内。
第二个表达式仅在第一列为null
时才检查第二列。 因此,如果第一列不是null
的范围,而不是时,条件不满足。 这更具限制性。
相当于:
nvl(update_date, insert_date)
between trunc(sysdate) - 2 and trunc(sysdate) - 1
将是:
update_date between trunc(sysdate) - 2 and trunc(sysdate) - 1
or (
update_date is null
and insert_dateBETWEEN trunc(sysdate) - 2 and trunc(sysdate) - 1
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.