PostgreSQL 中,使用 SUM(a) 时如果列 a 包含 NULL 值,其行为如下:
核心行为
SUM 函数会自动忽略 NULL 值,不会将其视为 0 参与计算。
sql
复制
— 示例数据
CREATE TABLE test (a INT);
INSERT INTO test VALUES (1), (2), (NULL), (3);
— 查询
SELECT SUM(a) FROM test;
— 结果: 6 (即 1+2+3,NULL 被忽略)
关键点
表格
复制
| 所有行都是 NULL | NULL | 没有可累加的值,返回 NULL |
| 部分行是 NULL | 非 NULL 值的总和 | NULL 被自动排除 |
| 包含 NULL + 0 | 与非 NULL 值相同 | 0 和 NULL 不同,0 会计入,NULL 不会 |
需要注意的情况
1. 全 NULL 返回 NULL
sql
复制
SELECT SUM(a) FROM test WHERE a IS NULL; — 结果: NULL
2. 与 COUNT 的区别
sql
复制
— SUM 忽略 NULL
SELECT SUM(a), — 6
COUNT(a), — 3 (忽略 NULL)
COUNT(*) — 4 (包含 NULL)
FROM test;
3. 如果需要将 NULL 视为 0
sql
复制
— 使用 COALESCE
SELECT SUM(COALESCE(a, 0)) FROM test; — 结果仍然是 6,但语义更清晰
— 或者在过滤时处理
SELECT SUM(a) FROM test WHERE a IS NOT NULL;
标准符合性
这种行为符合 SQL 标准 —— 聚合函数(SUM, AVG, MAX, MIN 等)都会忽略 NULL 值,只有 COUNT(*) 会统计所有行。
⚠️ 注意:这与编程语言中 null + number 的行为不同,SQL 聚合函数有专门的 NULL 处理语义。





