【问题标题】:Difference between NVL and OR in SQL oracleSQL oracle中NVL和OR的区别
【发布时间】:2020-03-05 17:41:39
【问题描述】:

Hej 伙计们,有人可以在下面的查询中向我解释 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,但我真的很想知道,为什么会有如此大的差异。谢谢解释

【问题讨论】:

    标签: sql oracle date where-clause


    【解决方案1】:

    UPDATE_DATE 不为空时,NVL(UDATE_DATE, INSERT_DATE) 评估为UPDATE_DATE,并且根本不会使用INSERT_DATEINSERT_DATE 在范围内的记录,但在该范围之外的非空 UPDATE_DATE 将包含在第一个查询中,但在第二个查询中排除。

    【讨论】:

      【解决方案2】:

      第一个条件表达式检查两列中的任何一列是否在目标日期范围内。

      第二个表达式检查第二列仅当第一列是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
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多