MySQL 中 union/union all 中如何处理空值?

问题描述 投票:0回答:3

基于以下声明

select null
union
select null

上述语句的输出为:

null

虽然此声明:

select null
union all
select null

输出:

null
null

null <> null
那么这里如何处理 null 值以及考虑哪种数据类型?

mysql sql union sql-null
3个回答
5
投票

在 SQL 中:

  • UNION
    是一个集合运算符,涉及检查(并抑制)重复行
  • 重复行定义为不不同
  • 不同(值或行)定义为:

两个值被认为是不不同的,如果:两者都是空值,或者根据第 8.2 节它们比较相等, “”。否则它们是不同的。两排 (或部分行)是不同的,如果至少其中一对 各自的价值观是不同的。否则它们就没有区别。这 评估两个值或两行是否为的结果 独特永远不会是未知的。

(以上是 SQL-92 规范的摘录,重点是我的)。所以,在这个例子中:

select null
union all
select null

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

UNION
仅返回一组重复行中的一行。


4
投票

在标准 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

0
投票

我认为您知道 UNION(删除重复结果)和 UNION ALL 之间的区别

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

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

© www.soinside.com 2019 - 2024. All rights reserved.