2012-10-04 45 views
10

我明白爲什麼null + 1或(1 + null)返回nullnull的意思是「未知值」,如果值是未知的,它的後繼者是未知的爲好。這同樣適用於大多數涉及空等操作真[*]爲什麼SUM(...)在空記錄集上返回NULL而不是0?

不過,我不爲什麼會發生以下情況瞭解

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0 

該查詢返回null。爲什麼?這裏沒有涉及的未知值! WHERE子句返回記錄,並且一組空值的總和爲0。[**]請注意,該集合不是未知,它是已知爲空

我知道,我可以用ISNULLCOALESCE解決此問題,但我想明白爲什麼行爲,這似乎違反直覺的我,被選爲。

任何見解爲什麼這是有道理的?


[*]有一些明顯的例外,如null OR true,其中顯然true是一個正確的結果,因爲未知值根本沒關係。

[**]就像一組空值的產品是1。從數學上講,如果我將$(Z,+)$擴展到$(Z union {null},+)$,那麼標識元素的明顯選擇仍然是0,而不是null,因爲x + 0 = x但是x + null = null

+0

也許是因爲使用的是聚集體。 – Kermit

+0

當你添加任何東西,你不會得到0,你什麼也得不到。 –

+0

你看過執行計劃嗎? – Kermit

回答

9

ANSI-SQL-Standard將空集的SUM的結果定義爲NULL。爲什麼他們這樣做,我不知道,但至少在所有數據庫引擎中行爲應該是一致的。

參考:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt 126頁上:如果AVG​​,MAX,MIN,或SUM被指定,然後

  Case: 

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

TXA

b)是從所選擇的列中的操作結果集。

+0

我認爲這是爲了保持一致性,因爲AVG,MIN,MAX的唯一明智的價值,所以我想他們決定不把SUM作爲特例。唯一的特例是「COUNT」。恥辱標準不包括它背後的理性。 –

+1

我已經開始[關於dba.stackexchange.com的一個問題](http://dba.stackexchange.com/q/25435/5273)瞭解*爲什麼*它是以這種方式標準化的。 – Heinzi

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作爲輸出..

+2

'當你的意思是空表時,你的意思是一個只有NULL值的表,'......不,絕對不是。 – Heinzi

相關問題