当我添加两列v
和w
时,如果一个或两个加数为NULL
,行的结果将为NULL
。这是有道理的。但是,如果我使用SUM(v)
对列进行求和,即使有NULL
,也会有数字结果。这是因为实际的便利吗?或者有理论上的理由吗?
这是一个澄清的例子(MySQL和sqlite):
CREATE TABLE x0 (
id INTEGER
, v DOUBLE
, w DOUBLE
);
INSERT INTO x0 VALUES
(1, 1, 1)
, (2, 1, 1)
, (3, NULL, 1)
, (4, 1, NULL)
, (5, NULL, NULL)
;
-- NULL if summand is NULL
SELECT v+w
FROM x0
;
-- v+w
-- 2
-- 2
-- \N
-- \N
-- \N
-- NULL if summand is NULL
SELECT id, v+w, SUM(v+w)
FROM x0
GROUP BY id
;
-- id v+w SUM(v+w)
-- 1 2 2
-- 2 2 2
-- 3 \N \N
-- 4 \N \N
-- 5 \N \N
-- There is numeric results even if some summands are NULL
SELECT SUM(v), SUM(w)
FROM x0
;
-- SUM(v) SUM(w)
-- 3 3
答案 0 :(得分:1)
ISO/IEC 9075:1992 Database Language SQL在第6.5节(< set function specification>),一般规则,1)b)中说:
让TX成为单列表 应用< value expression>的结果到T的每一行 并消除空值。
这就是它所说的。所以聚合函数必须忽略NULL,但是,正式来说,没有理由。
这种行为可以追溯到第一个SQL实现(IBM System R,Oracle V2),设计人员可能认为这是一个好主意。后来,没有人想要打破向后兼容性。
在这方面,与其他方面一样,SQL's handling of NULL values不一致,有时也不便携。
答案 1 :(得分:0)
例如在mysql中
SELECT id, ifnull(v,0)+infnull(w,0), SUM(ifnull(v,0)+infnull(w,0))
FROM x0
GROUP BY id
http://rustyrazorblade.com/2006/09/mysql-number-null-null/ https://www.tutorialspoint.com/mysql/mysql-null-values.htm https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html