2017-10-11 165 views
2

从 中选择sum(a)有时候Sum时,我们不需要检查null值,但是我们需要检查,谁能告诉我为什么?示例为什么加法需要检查null但总和不需要检查null?

总和我们不需要检查空值。

select sum(a) from 
(
select 1 a, null b from dual union 
select null, 1 b from dual 
) 

但除此之外,我们需要检查,如果我们不检查这将是空

select sum(nvl(a,0) + nvl(b,0)) from 
(
select 1 a, null b from dual union 
select null, 1 b from dual 
) 
+1

您使用的是MySQL还是Oracle? (不要标记不涉及的产品。) – jarlh

+0

只需执行sum(a)+ sum(b)'。 – jarlh

+0

[总和,平均值,最大值,最小值,NULL值计数]的可能重复(https://stackoverflow.com/questions/30175099/sum-avg-max-min-count-of-null-values) – MatSnow

回答

3

我会发布一个推测,在集合函数的默认行为是忽略NULL值与大多数时候期望的行为一致。

考虑Oracle,MySQL或大多数其他数据库中的平均功能AVG。想象一下,我们有一列值也包含一些空值。通过让AVG忽略空值,我们得到的结果与我们用所有非NULL值的平均值代替那些空值的结果相同。这是统计学家可能用来报告少数数据点未知时的平均值的常用技术。所以从统计的角度来看,忽略空值是有道理的,至少在这种非常普遍的情况下是合理的。另一方面,在基本算术的情况下,对于零值的这种推定不会如此好。考虑a + b + c其中任何列可能是NULL。假定NULL代表什么可能是危险的和误导性的,并且可能导致DBA得出结论:表达式的值在事实上并不知晓时是已知的。在这种情况下,我们仍然可以忽略空值或替换它们,并且存在COALESCE函数(或类似函数),但它必须手动使用。

4

一般来说,null通过传播表现形式,例如A + B

例外情况包括聚合函数,它们在进行聚合之前通常会删除null

这意味着

SUM(a) 

只是不考虑行,其中a is null

SUM(a + b) 

将放弃行,其中无论是a is nullb is null(因为a+bnull如果其中一方是null)。

编辑为什么这样。由于null代表缺少数据。对缺失数据进行操作的表达式不能被评估,并且导致再次丢失数据。聚集是明显的例外:即使某些的数据缺失,也可以执行它们。

+2

是的,但_why_是这种情况吗?我认为OP已经知道你发布了什么。 –

+0

我会说汇总只是为了方便的例外 - 总和(未知)应=未知,逻辑上。 –

+0

@JeffreyKemp'sum(null)'为'null'。但只要有一个不是'null'的值,聚合就会返回一个非空值。 –

0

刚刚从Oracle documentation补充:

所有聚合函数,除了COUNT(*),分组和GROUPING_ID 忽略空值。您可以在参数 聚合函数的参数中使用NVL函数将值替换为空值。 COUNT和 REGR_COUNT永远不会返回null,但会返回一个数字或零。对于 所有剩余的聚合函数,如果数据集不包含 行,或者仅包含具有空值的行作为聚合函数 的参数,则函数返回null。

忽略集合函数(如SUM)中的空值是一件好事,应该是预期的行为。

+0

忽略集合函数中的空值是件好事? –

+0

聚合函数通常用于大量数据集,例如MIN,MAX,AVG,RANK,VARIANCE,某些STAT功能等。当一个null发生时,它会非常快速地产生恼人的效果。此外,如果null表示“我不知道”,那么为大多数聚合默认null值为0,这是没有意义的(平均值4,4,null,null应该是4而不是2)。 – tbone

相关问题