添加列与使用NULL值对列进行求和之间的SQL差异

时间:2017-04-03 16:43:17

标签: mysql sql sqlite sum set-theory

当我添加两列vw时,如果一个或两个加数为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

2 个答案:

答案 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