NULL NOT IN(Empty_Relation)的SQL查询显示不同引擎上的不同行为

我尝试在Postrgresql,Spark上测试NULL NOT INEmpty_Relation的查询,但结果不同。

select count(*) from
(select 1)
where null not in
(a empty relation)

PostgreSQL输出1。 其他输出0。

我了解NOT IN的NULL行为,但是我的子查询是空关系,这种情况似乎更有趣。 有很多讨论NOT IN的帖子,但我找不到与NOT IN Empty_Relation相关的任何内容。

所以我的问题更像是ANSI SQL定义此行为还是实际上是灰色区域,两个答案都可以接受。

hahahaha548 回答:NULL NOT IN(Empty_Relation)的SQL查询显示不同引擎上的不同行为

tl; dr :PostgreSQL是正确的。

这是SQL规范对这种行为的说明:

  

4)表达式RVC NOT IN IPV等效于NOT ( RVC IN IPV )

     

5)表达式RVC IN IPV等效于RVC = ANY IPV

因此,NULL NOT IN (<empty relation>)等同于NOT (NULL = ANY (<empty relation>))

然后,继续说:

  

通过将隐含的R <comp op> <quantifier> T <comparison predicate>应用于R <comp op> RT中的每一行RT,得出T的结果。

     

[...]

     

d)如果T中的每一行<comparison predicate>的{​​{1}}为空,或者如果隐含的RT为False,则T为False。>

(注意:R <comp op> <some> T<some>ANY,它们的含义相同)。

根据此规则,由于SOME为空,因此T为False,因此NULL = ANY (<empty>)为True。

,

我很确定Postgres是正确的。

尽管几乎所有与NULL的比较都返回NULL,但是您发现了一个异常。如果集合为空,则集合中什么都没有。也就是说,任何值都不在集合中,而与值无关。

请记住,NULL的语义表示“未知”值-不是缺失值。 “未知”意味着它可以具有任何值。不论<anything> not in (<empty set>)的值如何,表达式<anything>都是正确的。

顺便说一句,Postgres并不孤单。粗略的外观表明,SQL Server和Oracle还返回1进行等效查询。

本文链接:https://www.f2er.com/3170010.html

大家都在问