2017-10-11 169 views
2

從 中選擇sum(a)有時候Sum時,我們不需要檢查null值,但是我們需要檢查,誰能告訴我爲什麼?示例爲什麼加法需要檢查null但總和不需要檢查null?

總和我們不需要檢查空值。

select sum(a) from 
(
select 1 a, null b from dual union 
select null, 1 b from dual 
) 

但除此之外,我們需要檢查,如果我們不檢查這將是空

select sum(nvl(a,0) + nvl(b,0)) from 
(
select 1 a, null b from dual union 
select null, 1 b from dual 
) 
+1

您使用的是MySQL還是Oracle? (不要標記不涉及的產品。) – jarlh

+0

只需執行sum(a)+ sum(b)'。 – jarlh

+0

[總和,平均值,最大值,最小值,NULL值計數]的可能重複(https://stackoverflow.com/questions/30175099/sum-avg-max-min-count-of-null-values) – MatSnow

回答

3

我會發佈一個推測,在集合函數的默認行爲是忽略NULL值與大多數時候期望的行爲一致。

考慮Oracle,MySQL或大多數其他數據庫中的平均功能AVG。想象一下,我們有一列值也包含一些空值。通過讓AVG忽略空值,我們得到的結果與我們用所有非NULL值的平均值代替那些空值的結果相同。這是統計學家可能用來報告少數數據點未知時的平均值的常用技術。所以從統計的角度來看,忽略空值是有道理的,至少在這種非常普遍的情況下是合理的。另一方面,在基本算術的情況下,對於零值的這種推定不會如此好。考慮a + b + c其中任何列可能是NULL。假定NULL代表什麼可能是危險的和誤導性的,並且可能導致DBA得出結論:表達式的值在事實上並不知曉時是已知的。在這種情況下,我們仍然可以忽略空值或替換它們,並且存在COALESCE函數(或類似函數),但它必須手動使用。

4

一般來說,null通過傳播表現形式,例如A + B

例外情況包括聚合函數,它們在進行聚合之前通常會刪除null

這意味着

SUM(a) 

只是不考慮行,其中a is null

SUM(a + b) 

將放棄行,其中無論是a is nullb is null(因爲a+bnull如果其中一方是null)。

編輯爲什麼這樣。由於null代表缺少數據。對缺失數據進行操作的表達式不能被評估,並且導致再次丟失數據。聚集是明顯的例外:即使某些的數據缺失,也可以執行它們。

+2

是的,但_why_是這種情況嗎?我認爲OP已經知道你發佈了什麼。 –

+0

我會說彙總只是爲了方便的例外 - 總和(未知)應=未知,邏輯上。 –

+0

@JeffreyKemp'sum(null)'爲'null'。但只要有一個不是'null'的值,聚合就會返回一個非空值。 –

0

剛剛從Oracle documentation補充:

所有聚合函數,除了COUNT(*),分組和GROUPING_ID 忽略空值。您可以在參數 聚合函數的參數中使用NVL函數將值替換爲空值。 COUNT和 REGR_COUNT永遠不會返回null,但會返回一個數字或零。對於 所有剩餘的聚合函數,如果數據集不包含 行,或者僅包含具有空值的行作爲聚合函數 的參數,則函數返回null。

忽略集合函數(如SUM)中的空值是一件好事,應該是預期的行爲。

+0

忽略集合函數中的空值是件好事? –

+0

聚合函數通常用於大量數據集,例如MIN,MAX,AVG,RANK,VARIANCE,某些STAT功能等。當一個null發生時,它會非常快速地產生惱人的效果。此外,如果null表示「我不知道」,那麼爲大多數聚合默認null值爲0,這是沒有意義的(平均值4,4,null,null應該是4而不是2)。 – tbone

相關問題