MySQL兩列或多列求和的問題及coalesce函數
1、問題
(文章開頭的資源爲本次使用的SQL腳本文件)在對數據庫的兩列或多列進行求和時,其中如果有一列爲如果存在值爲null的行,那麼求和後在對應行上求和字段的值也爲null,下面兩個SQL查詢語句展示的就是這種情況:
mysql> select * from my_test;
+----+------+-------+
| id | age | money |
+----+------+-------+
| 1 | 12 | NULL |
| 2 | 11 | NULL |
| 3 | NULL | 1 |
+----+------+-------+
mysql> select id, age, money, age + money as temp from my_test;
+----+------+-------+-------------+
| id | age | money | temp |
+----+------+-------+-------------+
| 1 | 12 | NULL | NULL |
| 2 | 11 | NULL | NULL |
| 3 | NULL | 1 | NULL |
+----+------+-------+-------------+
2、解決方案
我們希望12加上null得到12,而不是null,爲此需要將null轉換爲0值,在MySQL中可以使用IFNULL()函數,該函數也是MySQL獨有的,它接收兩個參數,語法如下:
IFNULL(expression, alt_value)
這兩個參數都是必傳的,其中expression是被用來判斷值是否爲null的表達式,若爲null則返回第二個參數alt_value的值,若不爲null則返回expression的值。
在上面求和的SQL中使用ifnull()函數,再次做查詢操作:
mysql> select id, age, money, ifnull(age, 0) + ifnull(money, 0) as temp from my_test;
+----+------+-------+------+
| id | age | money | temp |
+----+------+-------+------+
| 1 | 12 | NULL | 12 |
| 2 | 11 | NULL | 11 |
| 3 | NULL | 1 | 1 |
+----+------+-------+------+
可以看到結果如我們所期望的。當做其他算術運算時如果有null值也可以考試使用ifnull()函數。
3、擴展一:sum()函數的使用
sum()函數可以返回某一列的數據總和,當該列有值爲null的記錄時,並不會導致整個求和結果爲null,下面爲對money列使用sum()後的結果:
mysql> select sum(money) from my_test;
+------------+
| sum(money) |
+------------+
| 1 |
+------------+
4、擴展二:coalesce()函數的使用
COALESCE函數與IFNULL函數
在SQL內置的函數中,有一個函數也具備與IFNULL()函數類似的功能,它便是COALESCE()函數。
既然是SQL內置的函數,它就能用在所有實現了SQL標準的數據庫產品中,它需要一個或多個參數(當只傳兩個參數時,它所實現的效果同IFNULL()函數),返回第一個non-null參數,如果所有的參數都是null則返回Null,如下面的執行結果:
mysql> select coalesce(null, null, '1');
+---------------------------+
| coalesce(null, null, '1') |
+---------------------------+
| 1 |
+---------------------------+