从中选择总和(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
)
答案 0 :(得分:4)
通常,null
会通过A + B
等表达式传播。
例外包括聚合函数,通常在进行聚合之前删除null
。
这意味着
SUM(a)
只是不考虑a is null
而
SUM(a + b)
将丢弃a is null
或b is null
中的行(因为a+b
为null
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)是一件好事,应该是预期的行为。