1.IFNULL()方法
一般我們在使用ifnull()方法的時候,都是類似下面的語句:
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數字或字符串值
select ifnull(name,'no name') from person;
但是,有幾種情況,使用ifnull()方法無法將null轉換成0。這時,我們可以轉換一下思路。
當出現多表查詢的時候,我們可以使用left join 等表連接的方法解決將null轉換成0的問題。
當使用group by的情況下,使用ifnull也是不可以的,因爲這個時候是返回的集合爲空,ifnull無法處理,這個時候可以將數據再包一層的方法進行處理,如下:
select COUNT(*) from (select * from user_operator where type=400 ) as a
from裏面包裹的是要進行計算的查詢,然後在外面在執行一次count即可。
2.COALESCE函數
COALESCE函數從值列表中返回第一個非NULL的值,當遇到NULL值時將其替換爲0。 coalesce(str1,str2....);
需要在表中查出所有比'WARD'提成(COMM)低的員工,提成爲NULL的員工也包括在內。 (個人意見,如果數據庫提成字段默認值不是爲0值的話肯定是開發那個的錯)。
select ename,comm from emp where coalesce(comm,0) < (select comm from emp whrer ename ="WARD");
結果:
+--------+------+
| ename | comm |
+--------+------+
| SMITH | NULL |
| ALLEN | 300 |
| JONES | NULL |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| TURNER | 0 |
| JAMES | NULL |
| MILLER | NULL |
| ADAMS | NULL |
| FORD | NULL |
+--------+------+
12 rows in set
返回非NULL值:
select ename, comm,coalesce(comm,0) from emp where coalesce(comm,0) < (select comm from emp where ename = 'WARD');
+--------+------+------------------+
| ename | comm | coalesce(comm,0) |
+--------+------+------------------+
| SMITH | NULL | 0 |
| ALLEN | 300 | 300 |
| JONES | NULL | 0 |
| BLAKE | NULL | 0 |
| CLARK | NULL | 0 |
| SCOTT | NULL | 0 |
| KING | NULL | 0 |
| TURNER | 0 | 0 |
| JAMES | NULL | 0 |
| MILLER | NULL | 0 |
| ADAMS | NULL | 0 |
| FORD | NULL | 0 |
+--------+------+------------------+
12 rows in set