为什么空记录集上的SUM(...)返回NULL而不是0?

时间:2012-10-04 15:16:21

标签: sql-server null

我理解为什么null + 1或(1 + null)返回nullnull表示“未知值”,如果值未知,它的继任者也是未知的。对于涉及null的大多数其他操作也是如此。[*]

但是,我不明白为什么会发生以下情况:

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0

此查询返回null。为什么?这里没有未知的值! WHERE子句返回记录,一组空值的总和为0。[**]请注意,该集合不是 unknown ,它已知为空

我知道我可以使用ISNULLCOALESCE解决此问题,但我正在尝试理解为什么这种行为,这似乎与我,被选中了。

关于为什么这有意义的任何见解?


[*]有一些值得注意的例外情况,例如null OR true,显然true是正确的结果,因为未知值无关紧要。

[**]就像一组空值的乘积是1。从数学上讲,如果我将$(Z,+)$扩展到$(Z union {null},+)$,那么identity元素的明显选择仍然是0,而不是null ,自x + 0 = x以来x + null = null

2 个答案:

答案 0 :(得分:9)

ANSI-SQL-Standard将空集的SUM的结果定义为NULL。为什么他们这样做,我无法分辨,但至少所有数据库引擎的行为应该是一致的。

参考:第{126页的http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

  

b)如果指定了AVG,MAX,MIN或SUM,则

         Case:

         i) If TXA is empty, then the result is the null value.

TXA是所选专栏的有效结果集。

答案 1 :(得分:0)

如果您指的是空表,则表示只有NULL值的表格,这就是为什么我们将NULL作为聚合函数的输出。您可以将其视为SQL Server的设计。

示例1

CREATE TABLE testSUMNulls
(
    ID TINYINT
)
GO

INSERT INTO testSUMNulls (ID) VALUES (NULL),(NULL),(NULL),(NULL)

SELECT SUM(ID) FROM testSUMNulls

示例2

CREATE TABLE testSumEmptyTable
(
    ID TINYINT
)
GO

SELECT SUM(ID) Sums FROM testSumEmptyTable

在两个示例中,您将NULL作为输出..