与 Oracle SQL 中的 ALL 等 Compoperator 的 NULL 行为

Posted

技术标签:

【中文标题】与 Oracle SQL 中的 ALL 等 Compoperator 的 NULL 行为【英文标题】:NULL behavior with Comoperator like ALL in Oracle SQL 【发布时间】:2019-08-01 17:13:06 【问题描述】:
SELECT * FROM   hr.NullValueCheck  
ID      Name
1   abc
2   abc
3   bcd
4   cde

https://oracle-base.com/articles/misc/all-any-some-comparison-conditions-in-sql

查询 1:

SELECT *
FROM   hr.NullValueCheck  
where id > All (SELECT NULL  FROM DUAL )

什么都不会发生。

但对于以下问题。所有记录都来了,而子查询返回的是 NULL 与上面的查询相同(SELECT NULL FROM DUAL )

查询 2:

SELECT *
FROM   hr.NullValueCheck  
where id > All (SELECT id from  hr.NullValueCheck where id = 5)

请解释一下为什么查询 1 返回 No Records 但查询 2 返回所有记录。

据我所知,查询 1 也应该返回所有记录。

【问题讨论】:

【参考方案1】:

NULL 不同于空集。

第一个例子是说:“选择所有 id 大于NULL 的所有值的行”。或者更简单地说,“其中 id 大于 'NULL''。

在 SQL 中,'NULL' 一般具有“未知”的语义。如果您不知道该值,那么您不知道给定的id 是否更大。因此,不会返回任何行。

在第二个示例中,改为有一个空集进行比较。空集不是NULL。显然,任何数都大于空集中的所有数。因此,将返回所有行。

【讨论】:

以上是关于与 Oracle SQL 中的 ALL 等 Compoperator 的 NULL 行为的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql union all 合并多列

oracle中怎么用sql查表以及表的字段名

oracle导入

Oracle中常见的Hint

Oracle不同版本执行相同SQL语句,结果不一样,请大神赐教

PL/SQL Developer登录出现——Using a filter for all users can lead to poor performance!