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

Hei*_*nzi 11 sql-server null

我理解为什么null + 1或(1 + null)返回null:null意味着"未知值",如果值未知,其后继者也是未知的.对于涉及null的大多数其他操作也是如此.[*]

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

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以通过使用ISNULL或解决这种行为COALESCE,但我试图理解为什么这种行为对我来说是违反直觉的.

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


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

[**]就像一组空值的产物一样1.从数学上来说,如果我要延长$(Z,+)$到$(Z联盟{NULL},+)$,对标识元素显而易见的选择仍然是0null,因为x + 0 = x不过x + null = null.

TTo*_*oni 9

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

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

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

         Case:

         i) If TXA is empty, then the result is the null value.
Run Code Online (Sandbox Code Playgroud)

TXA是所选列的有效结果集.

  • 我已经开始[dba.stackexchange.com上的一个问题](http://dba.stackexchange.com/q/25435/5273)关于*为什么*它以这种方式标准化。 (2认同)