关于MySql中使用IFNULL()函数失效的问题。
今天在学习时,碰到一个问题:在联表查询取得结果后,如果取得的结果是空值,则给一个默认值,如果不是空值,则返回这个值。
下面我们来看看业务场景:
在menu表中:

存储的是前端页面的菜单配置,注意成员权限管理,报表权限管理和配置工具,这三个菜单是项目管理这个菜单的子菜单,他们通过parent_id这个字段进行关联。
在另外一张映射表project_menu中:

在将菜单归属到具体的项目下时,依然要把配置的父子菜单进行关联,但是在这里关联的id和上面关联的id是不一样的。
现在需求就是,在插入到project_menu表时,需要在插入时将子菜单的parent_id顺带插入其中。如果这个目录不是某个已存在目录的子菜单时,则parent_id默认是0,如果是某个菜单的子菜单,则需要关联表的查询,算出当前子目录的parent_id。
我们来看看一开始错误的写法:
SELECT IFNULL(id,0) from project_menu where code =
(SELECT code FROM menu where id =
(SELECT parent_id from menu where code = #{menuCode} and parent_id != 0))
AND project_id = #{projectId}
通过表的关联查询,得到当前目录的值,由于mybatis返回的值类型为int,所以如果查询到的值为null时,后台会报错,因此使用了IFNULL()函数,当id为null时,默认返回0。
但是这样做,在调试的时候,mybatis却一直报错该语句尝试返回null但定义的返回类型时int。说明这个函数并没有起作用。那为什么没有起作用呢?
那是因为这条语句的查询结果就是空的,也就是说,当传进来的参数是非子菜单时时,下面这条语句的返回值就是null
(SELECT parent_id from menu where code = #{menuCode} and parent_id != 0)
当这条语句返回null时,整条语句的返回值都是空的(where分支比select分支优先执行),这时,等价于下面这条语句:
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
使用条件判断选择语句。亲测有效。
关于MySql中使用IFNULL()函数失效的问题。的更多相关文章
- mysql中的ifnull()函数判断空值
我们知道,在不同的数据库引擎中,内置函数的实现.命名都是存在差异的,如果经常切换使用这几个数据库引擎的话,很容易会将这些函数弄混淆. 比如说判断空值的函数,在Oracle中是NVL()函数.NVL2( ...
- MySQL中的IFNULL,IF,NULLIF函数
MySQL中的IFNULL函数和IF函数 MySQL中的IFNULL函数类似于Oracle中的NVL函数,其表达式为:IFNULL(expr1,expr2),含义是:如果第一个参数不为空,则返回第一个 ...
- mysql中isnull,ifnull,nullif的用法
今天用到了MySql里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下: mysql中isnull,ifnull,nullif的用法如下: 1. isnull(expr) 的用法: ...
- Mysql中常用的函数汇总
Mysql中常用的函数汇总: 一.数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)ceiling(x) 返回大于x的最小整数值exp(x) 返回 ...
- Mysql中的常用函数:
Mysql中的常用函数: 1.字符串函数: (1).合并字符串 concat():// concat('M','y',"SQL",'5.5');== MySQL5.5//当传入的参 ...
- Mysql中使用find_in_set函数查找字符串
mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...
- mysql中的group_concat函数的用法
本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: grou ...
- SQLServer 中实现类似MySQL中的group_concat函数的功能
SQLServer中没有MySQL中的group_concat函数,可以把分组的数据连接在一起. 后在网上查找,找到了可以实现此功能的方法,特此记录下. SELECT a, stuff((SELECT ...
- mysql中的substr()函数
mysql中的substr()函数和hibernate的substr()参数都一样,就是含义有所不同. 用法: substr(string string,num start,num length); ...
随机推荐
- 【APP问题定位(三)】adb安装
先来剧透一下我们需要使用的工具 bin包 一个安装目录,可以免安装直接调用adb命令 Android SDK platform tools 下面依次为大家介绍,第1个和第2 ...
- java 数据分页
分页逻辑 import lombok.Data; /** * User eric * Date * Email yq@aso.ren */ @Data public class PageHelper ...
- ButterKnife的使用以及不能自动生成代码问题的解决
ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...
- 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...
- 0e开头MD5值小结
s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387 ...
- android shape 大全 (转)
1. 各属性的配置语法 在项目 res/drawable 文件夹中创建一个以 shape 为根节点的 XML 文件,基本语法如下: <?xml version="1.0" e ...
- HTML5到底将给企业带来什么?
HTML5 是近年来互联网行业的热门词汇,火的很.有人高调宣称"APP 将在几年内灭亡,HTML5 取而代之" 改变企业网络广告的模式与分布 广告是企业网络营销的主要方式之一 十几 ...
- 把项目中的那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建
在我们开发项目的时候,经常会遇到大块数据的问题(2M-100M),比如说保存报表中1w个人的ID号,他就像一个肿瘤一样,存储在服务器哪里都 觉得恶心,放在redis,mongodb中吧,一下子 ...
- 【Java入门提高篇】Day5 Java中的回调(二)
Java中有很多个Timer,常用的有两个Timer类,一个java.util包下的Timer,一个是javax.swing包下的Timer,两个Timer类都有用到回调机制.可以使用它在到达指定时间 ...
- Zabbix 3.0 部署监控 [二]
一.添加监控主机及设置 1.创建主机 Agent可以干一些SNMP无法干的事情,例如自定义监控项 snmp相关文章:http://www.abcdocker.com/abcdocker/1376 ...