MySQL ifnull的嵌套使用说明

 更新时间:2021年06月16日 14:50:03   作者:ls0111  
这篇文章主要介绍了MySQL ifnull的嵌套使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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的情况。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL的MaxIdleConns不合理,会变成短连接的原因

    MySQL的MaxIdleConns不合理,会变成短连接的原因

    这篇文章主要介绍了MySQL的MaxIdleConns不合理,会变成短连接的原因,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2021-01-01
  • MySQL8.0.20安装教程及其安装问题详细教程

    MySQL8.0.20安装教程及其安装问题详细教程

    这篇文章主要介绍了MySQL8.0.20安装教程及其安装问题处理,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • SQL函数Group_concat的用法及说明

    SQL函数Group_concat的用法及说明

    这篇文章主要介绍了SQL函数Group_concat的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • mysql之脏读、不可重复读、幻读的区别及说明

    mysql之脏读、不可重复读、幻读的区别及说明

    这篇文章主要介绍了mysql之脏读、不可重复读、幻读的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 关于MySQL innodb_autoinc_lock_mode介绍

    关于MySQL innodb_autoinc_lock_mode介绍

    下面小编就为大家带来一篇关于MySQL innodb_autoinc_lock_mode介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项

    MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项

    以下的文章主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用,需要的朋友可以了解下
    2012-12-12
  • 一文带你搞懂MySQL的MVCC机制

    一文带你搞懂MySQL的MVCC机制

    MySQL中的MVCC机制想必大家都有所耳闻吧,虽然在平时MySQL使用过程中基本上用不到,但是面试中出场率十分高,那么你对MVCC机制了解多少呢,MVCC机制是用来干嘛的呢,底层的工作原理是怎么样的呢,本文就带你一探究竟
    2023-07-07
  • 阿里云配置MySQL-server 8.0远程登录的实现

    阿里云配置MySQL-server 8.0远程登录的实现

    我们经常会碰到需要远程访问数据库的场景,本文主要介绍了阿里云配置MySQL-server 8.0远程登录的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • mysql用一个表更新另一个表的方法

    mysql用一个表更新另一个表的方法

    下面小编就为大家带来一篇mysql用一个表更新另一个表的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • MySQL连接异常:Communications link failure问题及解决

    MySQL连接异常:Communications link failure问题及解决

    这篇文章主要介绍了MySQL连接异常:Communications link failure问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论