为什么添加需要检查null但总和不需要检查null?

时间:2017-10-11 09:02:13

标签: mysql sql oracle

从中选择总和(a) 有时Sum,我们不需要检查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
)

3 个答案:

答案 0 :(得分:4)

通常,null会通过A + B等表达式传播。

例外包括聚合函数,通常在进行聚合之前删除null

这意味着

SUM(a)

只是不考虑a is null

的行
SUM(a + b)

将丢弃a is nullb is null中的行(因为a+bnull null,如果其中任何一个为null)。

编辑为什么会这样。

因为foreach (DataRow temprow in temptable.Rows) { temptable.Rows.IndexOf(temprow); } 代表缺少数据。无法评估对缺失数据进行操作的表达式,并再次导致缺少数据。聚合是明显的例外:即使缺少某些数据,也可以执行它们。

答案 1 :(得分:3)

我将发布一个推测,即在具有默认行为的聚合函数的情况下,忽略NULL值与大多数时间所需的行为一致。

考虑Oracle,MySQL或大多数其他数据库中的平均函数AVG。想象一下,我们有一列值也包含一些空值。通过让AVG忽略空值,我们得到的结果与我们用所有非NULL值的平均值替换这些空值相同。这将是一种常见的技术,当一些数据点未知时,统计学家可能会采用这种技术来报告平均值。因此,从统计的角度来看,忽略空值是有道理的,至少在这个非常常见的场景中是这样。

另一方面,在基本算术的情况下,对空值进行这样的假设不会那么好。考虑a + b + c,其中任何列可能是NULL。假设NULL表示什么可能是危险和误导的,并且可能导致DBA断定表达式的值是已知的,而事实上并非如此。在这种情况下,我们仍然可以忽略空值或替换它们,并且COALESCE函数(或类似的东西)存在,但必须手动使用。

答案 2 :(得分:0)

只需添加Oracle documentation

  

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

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