SQL - 将日期与可能返回null的内部选择进行比较

时间:2016-11-20 14:59:19

标签: sql oracle

我希望所有事件的开始日期都大于给定事件ID的开始日期(例如12345)。

我使用了以下查询:

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

我的问题是:

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

2 个答案:

答案 0 :(得分:0)

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

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
  Ñ

答案 1 :(得分:0)

  

如果没有ID为12345的事件会怎样?

由于子查询不返回任何行,而这些行在比较中将被视为NULL值,因此不会返回任何内容。

然而,在这种情况下,您可以重新编写查询以返回某些内容。但是如果没有更多的信息,你想要实现的目标很难说明。

  

如果事件12345没有startDate,即具有空值

,会发生什么?

同样,不会返回任何内容,因为null值的任何比较都会返回“undefined” - 当用作where子句中的条件时 - 基本上与“false”相同。

如果需要,可以使用某个默认日期处理该空值。选择哪个默认值完全取决于您的需求。你可以,例如使用非常早的日期,或今天或非常晚的日期

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