MySQL ifnull的嵌套使用说明
程序员文章站
2022-06-17 22:51:05
mysql ifnull的嵌套使用在网上查询ifnull有没有嵌套使用的方式,但是貌似没有人提到过这个用法:大都是简单的判断一个字段是否为空,然后用另外一个值代替的方式使用;即是:select ifn...
mysql ifnull的嵌套使用
在网上查询ifnull有没有嵌套使用的方式,但是貌似没有人提到过这个用法:大都是简单的判断一个字段是否为空,然后用另外一个值代替的方式使用;
即是:
select ifnull(a,b) from a ;
但是我遇到的问题是两个字段,大概场景是这样的:
每一个商店会有两种打折方式vip_discount与simple_discount,从数据库查出来以discount字段命名;且以vip_discount为主。
意思是如果vip_discount不为空,就返回它的值,若它的值为空就要进一步判断simple_discount字段是否为空,如果不为空就返回simple_discount的值,否则就返回一个空字符串。
这里我就想到了可不可以使用ifnull嵌套来判断达到我的目的。
在网上查了许久也没有发现有类似的博客,就寻思自己试试不就行啦:
select ifnull(vip_discount,ifnull(simple_discount,"")) as discount from a;
这样就解决问题了,此sql语句也可以在后面添加条件语句来补充其他条件查询。
mysql之ifnull的那些坑
废话不多说,直接看sql:
update lb_user u set u.user_level = ( select ifnull(levelid, u.user_level) from lb_user_level where `status` = 1 and levelid > u.user_level and (upgrade_score < u.empirical or upgrade_total_money < u.total_consumption_money) order by levelid desc limit 1 );
这个sql乍一看没什么问题,执行的时候也成功了,可再次执行就修改出错,原因是根据当前的条件无法检索出数据,返回数据为空,注意是数据为空,没有这条数据,而不是有这条数据存在该字段为空,经过排查,修改sql如下:
update lb_user u set u.user_level = ifnull(( select levelid from lb_user_level where `status` = 1 and levelid > u.user_level and (upgrade_score < u.empirical or upgrade_total_money < u.total_consumption_money) order by levelid desc limit 1 ), u.user_level);
经过修改后执行就成功了,并且不存在ifnull失效的情况;
总结原因是因为:
mysql中ifnull仅可以判断该数据存在的情况下为null,而不能判断该条数据没有查询到而为null的情况。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
浅谈SQLServer的ISNULL函数与Mysql的IFNULL函数用法详解
-
浅谈Mysql中类似于nvl()函数的ifnull()函数
-
MySQL嵌套事务所遇到的问题
-
关于mysql数据库中distinct,concat,ifnull的使用讲解
-
mysql中替代null的IFNULL()与COALESCE()函数详解
-
mysql 存储过程中双重循环嵌套的应用
-
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
-
MySql中 is Null段判断无效和IFNULL()失效的解决方案
-
MySQL的IFNULL()、ISNULL()和NULLIF()函数实例讲解
-
MySQL流程控制IF()、IFNULL()、NULLIF()、ISNULL()函数的使用