在統計、計算、合併資料時,空值擴散問題,有時不經意冒出來,一不小心,就會導致結果出錯。
我舉個例子。
有乙個成績表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)
這樣寫,似乎麻煩了一些,但是,它是乙個安全的**。
在Firebird裡如何防止空值擴散
在統計 計算 合併資料時,空值擴散問題,有時不經意冒出來,一不小心,就會導致結果出錯。我舉個例子。有乙個成績表achieve,有四個字段 yuwen shuxue yingyu total,分別用來儲存語文 數學 英語及總分。現在要計算學生的總分,現寫出如下sql語句 update achieve ...
varbinary MAX 如何插入空值
1 在c 程式中 為 byte 變數賦值 eg 變數 a new byte 0 2 在程式中鏈結sql server時 photo欄位是varbinary max 型別,如果使用者未選擇檔案,應該插入空值,但不知如何寫 嘗試了,用null不行 用dbnull.value 會導致不是空值 也不行 us...
datatable 重複初始化 防止值為空
本人blog中中寫的datatable版本是1.10及其以上的文章。起之前版本是否使用暫時沒有研究過。直接看錯誤 datatables warning table id rap table list comm mem cannot reinitialise datatable.for more in...