Sql-Server
處理這麼多 isnull() 情況的更簡單方法
有什麼好的方法可以避免
isnull()
在儲存過程中多次編寫函式嗎?我有一個使用該
isnull()
函式幾乎 30 次的儲存過程,我認為我缺少一個概念,但是在找到更好的方法來獲取我的數據之前,我會喜歡從這麼多isnull()
函式中清理我的程式碼。我可以將 SQL Server 2008 R2 設置為使用空值作為浮點 0 嗎?
isnull()
如果沒有數據,我的大部分只是添加零 0 值,這樣我就可以進行數學運算。編輯:我並不懶惰,我只是想清理我的程式碼並避免選擇部分看起來像這樣
select vrsta.NAZIV ,isnull(sum(prod.prod_mpci),0) as prod_MPCI ,isnull(sum(isnull(mal_MPCI,0) + (vel_kol * isnull(mal_MPC,vel_VPC))),0) as lager_mpci ,isnull(sum(vel_NCI),0)+isnulL(sum(mal_NCI),0) as lager_nci ,sum( case when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC) else 0 end ) as visak_MPC ,sum( case when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC) else 0 end ) as visak_MPC ,sum( case when isnull(vel_KOL,0)+isnull(mal_KOL,0) <= isnull(prod.prod_kol,0) then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC) else 0 end ) as manjak_MPC ,sum( case when isnull(vel_KOL,0)+isnull(mal_KOL,0) <= isnull(prod.prod_kol,0) then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC) else 0 end ) as manjak_NC
不,沒有辦法告訴 SQL Server 將所有 NULL 浮點值視為零。您將不得不用
ISNULL()
or 包圍這些表達式,恕我直言,更好COALESCE()
。您可以在視圖中執行此操作,因此您不必在每個查詢中重複它。
我有一個類似的查詢顯示大量封裝 ISNULL 語句。我需要空值來表示尚未觸及的項目(因為許多列需要不同的標識符來進行更改)。我嘗試了一百萬種不同的方法來解決它,最後只得到了一個帶有一堆 ISNULL 的煩人的長程式碼。關於“帶有一堆 ISNULL 的令人討厭的長編碼”的重要一點是,它每次都對我來說非常完美。我建議只是找到一種模式來使用它們來清理程式碼的外觀並使其更容易導航。
至於使用 COALESCE 的建議,我不會根據您嘗試返回的記錄數量來建議它。我一遍又一遍地讀到 COALESCE 會影響性能,儘管有一些好處。
https://stackoverflow.com/questions/7408893/isnull-vs-coalesce http://www.sqlservercentral.com/Forums/Topic832742-392-5.aspx#bm1352397