当我将两列v
和w
加在一起时,如果一个或两个加数是NULL
,行的结果给出NULL
。这是有道理的。但是如果我用SUM(v)
总结这一列,即使有NULL
s也会有数字结果。这是由于实际的便利吗?还是有理论上的理由?列之间的SQL差异以及列与NULL值之间的SQL差异
下面是一个例子来阐明(MySQL和源码):
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
SQL远不具备完善而一致的理论基础。只要接受这是标准如何定义操作。 “理论上”,如果任何参数为NULL,则值应该为NULL,因为NULL值是不确定的。 –
@GordonLinoff我认为SQL是基于集合论。因此,为了便利,它似乎在某些情况下保留了数学的完整性,例如,使用像SUM这样的函数。 – giordano
标准SQL只是忽略/删除聚合函数中的NULL。否则,你必须在NULL(NULL(COALESCE(mycolumn,9999999))这样的NULLable列上使用COALESCE,然后很难知道返回的9999999是否实际上是最低值或NULL替换。 – dnoeth