11

我理解为什么null + 1or ( 1 + null) 返回null:null表示“未知值”,如果一个值是未知的,它的后继也是未知的。大多数其他涉及 null 的操作也是如此。[*]

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

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0

此查询返回null. 为什么?这里不涉及未知值!WHERE 子句返回条记录,空值集的总和为0.[**] 请注意,该集不是unknown,而是已知为 empty

我知道我可以使用ISNULLor来解决这种行为COALESCE,但我试图理解为什么选择了这种对我来说似乎违反直觉的行为。

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


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

[**] 就像一组空值的乘积是1. 从数学上讲,如果我将 $(Z, +)$ 扩展为 $(Z union {null}, +)$,标识元素的明显选择仍然是0, not null, 因为x + 0 = xbut x + null = null

4

2 回答 2

10

ANSI-SQL 标准将空集的 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.

TXA 是所选列的操作结果集。

于 2012-10-04T15:34:12.373 回答
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作为输出..

于 2015-10-05T07:06:15.600 回答