一般我们在使用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即可。
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