sql - 为什么 SUM(null) 在 Oracle 中不是 0?

标签 sql database oracle plsql

遇到空值时,如果能解释 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 聚合怪癖:

  1. Count() 永远不会返回 null(当然也不会返回负数)
  2. 仅选择没有分组依据的聚合函数将始终返回单行,即使没有可供选择的数据也是如此。

所以...

Coalesce(Count(<expression>),0)

... 浪费了良好的合并。

关于sql - 为什么 SUM(null) 在 Oracle 中不是 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17511567/

相关文章:

php - 形成一个 SQL 查询,从表中查找姓名中包含 's' OR 'O' 的人员的总年龄

mysql - find_in_set 与 or 有什么区别(索引选择?速度?)

sql - 在 SQL : add a column based on before or after date? 中

java - 如何使用 oracle.jdbc.driver.OracleLog?

sql - Arel 中的 SQL WITH RECURSIVE 等价物

php - 替换枚举值

c# - SQL 数据库的 "developer/test"模式

php - 我们如何删除 $file_info[path] 末尾的斜杠 '/'

mysql - 如何更新时间戳

php - 具有多个表的oracle php回滚