我理解为什么null + 1
或(1 + null
)返回null
:null
表示“未知值”,如果值未知,它的继任者也是未知的。对于涉及null的大多数其他操作也是如此。[*]
但是,我不明白为什么会发生以下情况:
SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0
此查询返回null
。为什么?这里没有未知的值! WHERE子句返回零记录,一组空值的总和为0
。[**]请注意,该集合不是 unknown ,它已知为空。
我知道我可以使用ISNULL
或COALESCE
解决此问题,但我正在尝试理解为什么这种行为,这似乎与我,被选中了。
关于为什么这有意义的任何见解?
[*]有一些值得注意的例外情况,例如null OR true
,显然true
是正确的结果,因为未知值无关紧要。
[**]就像一组空值的乘积是1
。从数学上讲,如果我将$(Z,+)$扩展到$(Z union {null},+)$,那么identity元素的明显选择仍然是0
,而不是null
,自x + 0 = x
以来x + null = null
。
答案 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
作为输出..