基于以下声明
select null
union
select null
上述语句的输出为:
null
虽然此声明:
select null
union all
select null
输出:
null
null
如
null <> null
那么这里如何处理 null 值以及考虑哪种数据类型?
在 SQL 中:
UNION
是一个集合运算符,涉及检查(并抑制)重复行两个值被认为是不不同的,如果:两者都是空值,或者根据第 8.2 节它们比较相等, “
”。否则它们是不同的。两排 (或部分行)是不同的,如果至少其中一对 各自的价值观是不同的。否则它们就没有区别。这 评估两个值或两行是否为的结果 独特永远不会是未知的。
(以上是 SQL-92 规范的摘录,重点是我的)。所以,在这个例子中:
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。这意味着 union 返回正确的结果(去重)