SQL中如何處理除數(shù)為0的情況?
本文轉(zhuǎn)載自微信公眾號「SQL數(shù)據(jù)庫開發(fā)」,作者丶平凡世界。轉(zhuǎn)載本文請聯(lián)系SQL數(shù)據(jù)庫開發(fā)公眾號。
問題
我們在進行數(shù)據(jù)統(tǒng)計的時候,經(jīng)常會遇到求百分比,環(huán)比,同比等這些需要除以某個數(shù)的情況,而如果除數(shù)為0,數(shù)據(jù)庫是會報錯的。
那么遇到這樣的情況我們怎么處理呢?下面我們用示例給大家講解一下處理方法。
解決辦法
情況一
例如
- SELECT A/B FROM TAB
遇到這樣的情況,一般的處理方法是用CASE WHEN來判斷B的值
- SELECT
- CASE WHEN B=0 THEN 0 ELSE A/B END
- FROM TAB
這樣當(dāng)B如果是0,我們直接賦一個值,避免A/B參與計算報錯。
情況二
上面是一種常見的情況,但是如果遇到下面這樣的聚合函數(shù)呢?
例如
- SELECT SUM(A)/COUNT(B) FROM TAB
遇到這樣的情況CASE WHEN 是不能判斷COUNT(B)的值的,因為WHEN后面的條件不能使用聚合函數(shù)(語法要求),這個時候我們可以這樣處理
- SELECT
- ISNULL(SUM(A)/NULLIF(COUNT(B),0),0)
- FROM TAB
其中這里使用了兩個函數(shù),NULLIF()和ISNULL()
NULLIF函數(shù)有兩個參數(shù),定義如下:
NULLIF( expression1 , expression2 )
其作用就是:如果兩個指定的表達式相等,就返回NULL值。
ISNULL函數(shù)也有兩個參數(shù),定義如下:
ISNULL( expression1 , expression2 )
其作用是:如果第一個參數(shù)的結(jié)果為NULL,就返回第二個參數(shù)的值。
當(dāng)COUNT(B)的結(jié)果為0時,恰好與第二個給定的參數(shù)0相等,這個時候NULLIF函數(shù)就會返回NULL,而SUM(A)在除以NULL時結(jié)果為NULL,外層使用ISNULL函數(shù)再對NULL值進行判斷,這樣最終結(jié)果就是0了。
這兩種方法就是我們?nèi)粘L幚沓龜?shù)為0的情況了,一定要記得哦!