基于以下陈述
select null
union
select null
上述语句的输出是:
null
虽然此声明:
select null
union all
select null
输出:
null
null
那么null <> null
这里如何处理值 null 以及它被认为是哪种数据类型
UNION
是一个集合运算符,涉及检查“重复行”。规范将重复行定义为“不不同”。SQL-92 规范的摘录:
两个值在以下情况下称为不相异:两者都是空值,或者根据第 8.2 节“<comparison predicate>”它们比较相等。否则它们是不同的。如果两行(或部分行)的相应值对中的至少一对是不同的,则两行(或部分行)是不同的。否则它们不是不同的。评估两个值或两行是否不同的结果永远是未知的。
(强调我的)。所以,在这个例子中:
select null
union all
select null
这两行被认为是彼此重复的,因为第一列中的空值被认为是不同的......即相同。根据定义,UNION
只返回一组重复行中的一行。
在标准 SQL 中,UNION
删除重复记录,UNION ALL
不删除。幸运的是,您的 RDBMS 足够聪明,可以找出NULL IS NULL
,并在使用时消除重复行UNION
。
注意:null = null
是unknown
,但是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
我正在考虑您知道 UNION(重复数据删除结果)和 UNION ALL 之间的区别
select 'x' from dual where null is null \\results with x
在这种情况下,null 实际上是 null。这意味着联合返回正确的结果(去重)