2017-04-03 161 views
1

当我将两列vw加在一起时,如果一个或两个加数是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 
+1

SQL远不具备完善而一致的理论基础。只要接受这是标准如何定义操作。 “理论上”,如果任何参数为NULL,则值应该为NULL,因为NULL值是不确定的。 –

+0

@GordonLinoff我认为SQL是基于集合论。因此,为了便利,它似乎在某些情况下保留了数学的完整性,例如,使用像SUM这样的函数。 – giordano

+1

标准SQL只是忽略/删除聚合函数中的NULL。否则,你必须在NULL(NULL(COALESCE(mycolumn,9999999))这样的NULLable列上使用COALESCE,然后很难知道返回的9999999是否实际上是最低值或NULL替换。 – dnoeth

回答

1

ISO/IEC 9075:1992 Database Language SQL说,在6.5节(<设定功能规范>),总则空值

如,1)b):

设TX为单列表格,即将<值表达式>应用于T 的每一行并消除空值的结果为 。

就是这么说的。所以聚合函数必须忽略NULL,但是,官方没有任何理由。

此行为可追溯到第一个SQL实现(IBM System R,Oracle V2),其中设计者可能认为这将是一个好主意。后来,没有人想要打破向后兼容性。

在这方面,与其他人一样,SQL's handling of NULL values不一致,有时不便携。