SQL - 比较日期和内部select可能返回null
问题描述:
我想要获取所有事件的开始日期大于给定事件ID(例如12345)的开始日期。SQL - 比较日期和内部select可能返回null
我用下面的查询:
SELECT *
FROM Events
WHERE StartDate > (SELECT StartDate
FROM Events
WHERE ID = 12345)
我的问题是:
- 会发生什么事,如果有ID为12345没有事件?
- 会发生什么,如果事件12345没有的startDate即具有空值
答
如果有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
ň
为什么你不测试它? – Kacper
简而言之,在这两种情况下你都不会得到任何结果 –