繁体   English   中英

SQL oracle中NVL和OR的区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM