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