SQL - 比较日期和内部select可能返回null

问题描述:

我想要获取所有事件的开始日期大于给定事件ID(例如12345)的开始日期。SQL - 比较日期和内部select可能返回null

我用下面的查询:

SELECT * 
FROM Events 
WHERE StartDate > (SELECT StartDate 
        FROM Events 
        WHERE ID = 12345) 

我的问题是:

  1. 会发生什么事,如果有ID为12345没有事件?
  2. 会发生什么,如果事件12345没有的startDate即具有空值
+0

为什么你不测试它? – Kacper

+0

简而言之,在这两种情况下你都不会得到任何结果 –

如果有ID为12345任何情况下,会发生什么?

没有将返回为子查询不返回这反过来将被视为在比较NULL值的任何行。

但是,您可以重新编写查询以返回某种情况。但没有更多的信息,你试图达到这个目标很难说。作为使用时 -

会发生什么,如果事件12345没有的startDate即具有空值

同样,因为空值返回任何比较“不确定”,这什么都不会被退回条件在where子句中 - 基本上与“false”相同。

如果你愿意,你可以用一些默认日期来对待那个空值。选择哪个默认取决于你想要的。你可以例如使用非常早的日期,或今天或非常晚的日期

SELECT * 
FROM events 
WHERE startdate > (SELECT coalesce(startdate, sysdate) 
        FROM events 
        WHERE id = 12345) 

在这两种情况下,你会得到任何结果,因为没有什么比空
大 (或小于或等于或不同于)

select case 
      when (select sysdate from dual where dummy = 'Y') is null 
      then 'Y' 
      else 'N' 
     end   as empty_result_set_is_null 

from dual 
; 

empty_result_set_is_null
Ÿ

select case 
      when sysdate+7 > (select sysdate from dual where dummy = 'Y') 
      then 'Y' 
      else 'N' 
     end   as is_bigger 

from dual 
; 

is_bigger
ň

select case 
      when sysdate > (select cast (null as date) from dual) 
      then 'Y' 
      else 'N' 
     end   as is_bigger 

from dual 
; 

is_bigger
ň