ifnull查询条件本为null时无效问题解决

本文深入探讨了在使用MyBatis框架时遇到的返回null错误,并详细解析了为何在查询结果为空时,预定义的返回类型int会引发问题。通过具体的SQL语句示例,介绍了如何运用CASE WHEN语句来避免返回null,确保函数能够正确处理空值情况,从而提供了一种有效的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在调试的时候,mybatis却一直报错该语句尝试返回null但定义的返回类型时int。说明这个函数并没有起作用。那为什么没有起作用呢?

那是因为这条语句的查询结果就是空的,也就是说,当传进来的参数是非子菜单时时,下面这条语句的返回值就是null

1 (SELECT parent_id from menu where code = #{menuCode} and parent_id != 0)

当这条语句返回null时,整条语句的返回值都是空的(where分支比select分支优先执行),这时,等价于下面这条语句:

1 SELECT IFNULL(id,0) from project_menu where code = NULL

这就不是这个当id为空时,用0替换id返回这个概念了,因为当语句本身就是null时,语句中的函数还会起作用吗?

所以,此方法行不通,附上解决方案:

SELECT
CASE
WHEN (SELECT parent_id from menu where code = #{code}) = 0
THEN 0
ELSE
(SELECT id from project_menu where code =
(SELECT code FROM menu where id =
(SELECT parent_id from menu where code =#{code} ))
AND project_id=#{projectId})
END


例子:原来的sql语句:select provinceID from kdmc_t_province where name =#{province}
由于name=的province本来就为null,导致ifnull无效
select ifnull(provinceID ,0) from kdmc_t_province where name =#{province}
解决方法:
select CASE WHEN (select provinceID from kdmc_t_province where name =#{province})is null THEN
0
ELSE (select provinceID from kdmc_t_province where name =#{province})
END;
解决!!


链接:https://www.jianshu.com/p/d59589221f2c
来源:简书
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值