在統計、計算、合並數據時,空值擴散問題,有時不經意冒出來,一不小心,就會導致結果出錯。
我舉個例子。
有一個成績表achIEve,有四個字段:yuwen、shuxue、yingyu、total,分別用來存儲語文、數學、英語及總分。現在要計算學生的總分,現寫出如下SQL語句:
update achIEve set total=yuwen+shuxue+yingyu
這句語句好像是沒錯的,但有時得不出有用的結果,比如,有個學生語文80,數學90,英語缺考,沒填成績,這時yingyu字段的值很可能不是0而是NULL,空值,要看設計的人是什麼想法。如果yingyu的值為NULL,那麼,大家猜猜,計算出來,總分字段total為多少?
按一般的想法,當然是80+90,這個學生的總分是170,英語字段不參加計算。但是,這是錯誤的!
實際計算出來,這個學生的總分為空(NULL)。
在一個SQL計算表達式裡,如果有一個值為空,那麼結果就一定為空!這就是空值擴散!!!
那麼,如何防止出現空值擴散的情況呢?
在這方面,SQL Server提供了ISNULL()函數,Access提供了NZ()函數,都可以解決這個問題,這些函數就是提供一個判斷功能:如果為空,則用某個值代替,比如用0或用空字符串等。Firebird有類似函數麼?
有,那就是函數coalesce()。
只要將以上的SQL語句改為如下即可。
update achIEve set total=coalesce(yuwen,0)+coalesce(shuxue,0)+coalesce(yingyu,0)
這樣寫,似乎麻煩了一些,但是,它是一個安全的代碼。