遇到空值时,如果能解释 Oracle 中 SUM 函数的内部功能,我们将不胜感激:
结果
select sum(null) from dual;
is null
但是当一个空值在一个值序列中时(比如一个可以为空的列的总和),空值的计算值将为 0
select sum(value) from
(
select case when mod(level , 2) = 0 then null else level end as value from dual
connect by level <= 10
)
is 25
看到
的结果会更有趣
select (1 + null) from dual
is null
因为任何使用 null 的操作都将导致 null(is null
运算符除外)。
==========================
一些因评论而更新:
create table odd_table as select sum(null) as some_name from dual;
结果:
create table ODD_TABLE
(
some_name NUMBER
)
为什么 some_name
列的类型是 number?
最佳答案
如果您正在寻找这种行为的基本原理,那么可以在 ANSI SQL 标准中找到它,该标准规定聚合运算符忽略 NULL 值。
如果您想覆盖该行为,那么您可以:
Sum(Coalesce(<expression>,0))
...尽管将 Sum() 用于...会更有意义
Coalesce(Sum(<expression>),0)
你可能更有意义:
Avg(Coalesce(<expression>,0))
……或者……
Min(Coalesce(<expression,0))
其他 ANSI 聚合怪癖:
- Count() 永远不会返回 null(当然也不会返回负数)
- 仅选择没有分组依据的聚合函数将始终返回单行,即使没有可供选择的数据也是如此。
所以...
Coalesce(Count(<expression>),0)
... 浪费了良好的合并。
关于sql - 为什么 SUM(null) 在 Oracle 中不是 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17511567/