MySQL ifnull的嵌套使用说明

这篇文章主要介绍了MySQL ifnull的嵌套使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MySQL ifnull的嵌套使用

在网上查询ifnull有没有嵌套使用的方式,但是貌似没有人提到过这个用法:大都是简单的判断一个字段是否为空,然后用另外一个值代替的方式使用;

即是:

?

1

select ifnull(a,b) from A ;

但是我遇到的问题是两个字段,大概场景是这样的:

每一个商店会有两种打折方式vip_discount与simple_discount,从数据库查出来以discount字段命名;且以vip_discount为主。

意思是如果vip_discount不为空,就返回它的值,若它的值为空就要进一步判断simple_discount字段是否为空,如果不为空就返回simple_discount的值,否则就返回一个空字符串。

这里我就想到了可不可以使用ifnull嵌套来判断达到我的目的。

在网上查了许久也没有发现有类似的博客,就寻思自己试试不就行啦:

?

1

select ifnull(vip_discount,ifnull(simple_discount,"")) as discount from A;

这样就解决问题了,此SQL语句也可以在后面添加条件语句来补充其他条件查询。

MYSQL之ifnull的那些坑

废话不多说,直接看SQL:

?

1

2

3

4

5

6

7

8

9

10

11

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如下:

?

1

2

3

4

5

6

7

8

9

10

11

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持钦钦技术栈。

原文链接:https://blog.csdn.net/ls0111/article/details/73459755

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/6960/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-07-31 3:29:27
下一篇 2022-07-31 3:29:37

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!