关于MySQL中IFNULL用法的记录

问题发现背景

在昨天的工作中,遇到了一个MySQL查询查询记录统计个数的需求,于是直接在MyBatis的XML里面写了SQL进行查询.
SQL语句如下:

SELECT  COUNT(*)
        FROM paytixianapply y
        WHERE y.cashierid=1 AND y.state=3 GROUP BY y.cashierid

结果接口测试时候发现报错.大概是这样的错误:
null不可赋值给int
由于错误已经修改所以找不到报错信息了!

当时考虑是Mapper里面的resultType设置的是Integer,而Service里获取结果是用的int的关系,后来改成Integer还是不行.

解决问题过程

后来查阅了一些资料,发现应该是SQL的执行结果为空,所以返回值为null,Integer包装类也就为null,当然不能赋值给int了.
于是我考虑使用IFNULL函数,将SQL修改为:

SELECT  IFNULL(COUNT(*),0)
        FROM paytixianapply y
        WHERE y.cashierid=1 AND y.state=3 GROUP BY y.cashierid

而且这次为了避免出错,预先在Navicat工具里尝试运行这条查询语句.
结果返回值依然为null
在这里插入图片描述
百思不得其解.以为是MySQL不支持IFNULL函数的原因.但是由于昨天接口继续提交,所以将null在Java中进行了处理,如果返回值为null,则给值赋值为0.

问题原因

但是在今天的工作中,在以前的代码里发现了一句也是用IFNULL函数的语句.区别是我昨天IFNULL里面是COUNT函数,今天看到的是SUM函数.
语句如下:

SELECT ifnull(SUM(questionprice),0.00) as sumindeed FROM payincomeuser WHERE questionuserid=10001019

正好今天工作内容不多,于是专心下来研究这个问题.在继续翻阅一些关于COUNT函数的资料之后.发现原因是:
在WHERE语句之后筛选条件的结果为空,或使用了GROUP BY.导致COUNT函数的返回值为NULL;
然而当COUNT为NULL时,不能直接像SUM函数那样IFNULL,而是要将整个查询作为IFNULL函数的第一个参数.

解决办法

最后将SQL语句改为如下写法:
将整个查询作为函数的第一个参数就可以了

SELECT  ifnull(
(select COUNT(*)  as cncount
        FROM paytixianapply y
        WHERE y.cashierid=1 AND y.state=3 GROUP BY y.cashierid),0) as account

结果就对了
在这里插入图片描述

太坑了啊啊啊啊!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值