3

基于以下陈述

select null
union
select null

上述语句的输出是:

null

虽然此声明:

select null
union all
select null

输出:

null
null

那么null <> null这里如何处理值 null 以及它被认为是哪种数据类型

4

3 回答 3

4

UNION是一个集合运算符,涉及检查“重复行”。规范将重复行定义为“不不同”。SQL-92 规范的摘录:

两个值在以下情况下称为不相异:两者都是空值,或者根据第 8.2 节“<comparison predicate>”它们比较相等。否则它们是不同的。如果两行(或部分行)的相应值对中的至少一对是不同的,则两行(或部分行)是不同的。否则它们不是不同的。评估两个值或两行是否不同的结果永远是未知的。

(强调我的)。所以,在这个例子中:

select null
union all
select null

这两行被认为是彼此重复的,因为第一列中的空值被认为是不同的......即相同。根据定义,UNION只返回一组重复行中的一行。

于 2018-12-28T11:11:33.813 回答
3

在标准 SQL 中,UNION删除重复记录,UNION ALL不删除。幸运的是,您的 RDBMS 足够聪明,可以找出NULL IS NULL,并在使用时消除重复行UNION

注意:null = nullunknown,但是null <> null也是unknown。检查无效性的唯一方法是使用类似IS NULL.

SELECT case when null <> null then 1 else 0 end;  --> yields : 0
SELECT case when null =  null then 1 else 0 end;  --> yields : 0
SELECT case when null IS null then 1 else 0 end;  --> yields : 1
于 2018-12-28T09:56:59.133 回答
0

我正在考虑您知道 UNION(重复数据删除结果)和 UNION ALL 之间的区别

select 'x' from dual where null is null \\results with x 

在这种情况下,null 实际上是 null。这意味着联合返回正确的结果(去重)

于 2018-12-28T09:55:29.860 回答