我明白爲什麼null + 1
或(1 + null
)返回null
:null
的意思是「未知值」,如果值是未知的,它的後繼者是未知的爲好。這同樣適用於大多數涉及空等操作真[*]爲什麼SUM(...)在空記錄集上返回NULL而不是0?
不過,我不爲什麼會發生以下情況瞭解:
SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0
該查詢返回null
。爲什麼?這裏沒有涉及的未知值! WHERE子句返回零記錄,並且一組空值的總和爲0
。[**]請注意,該集合不是未知,它是已知爲空。
我知道,我可以用ISNULL
或COALESCE
解決此問題,但我想明白爲什麼這行爲,這似乎違反直覺的我,被選爲。
任何見解爲什麼這是有道理的?
[*]有一些明顯的例外,如null OR true
,其中顯然true
是一個正確的結果,因爲未知值根本沒關係。
[**]就像一組空值的產品是1
。從數學上講,如果我將$(Z,+)$擴展到$(Z union {null},+)$,那麼標識元素的明顯選擇仍然是0
,而不是null
,因爲x + 0 = x
但是x + null = null
。
也許是因爲使用的是聚集體。 – Kermit
當你添加任何東西,你不會得到0,你什麼也得不到。 –
你看過執行計劃嗎? – Kermit