关于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); ...
随机推荐
- php 常用 常量集合
DIRECTORY_SEPARATOR 常量 DIRECTORY_SEPARATOR 目录分割符
- web前端-----JAVA Script(一)
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase ...
- Python之argparse模块
argparse 命令行参数解析模块,原optparse已经停止开发,建议替换为argparse 在python2.7后默认加入 parser ArgumentParser默认解析来源sys.argv ...
- Shiro SpringMVC 非maven HelloWorld
项目用到Shiro就从网上找一些案例看看吧,结果看了很多都是maven的,没有办法就自己弄了一个.废话不多说,原理自己找开始上菜. 配置web.xml <?xml version="1 ...
- 通过 Visual Studio 的“代码度量值”来改进代码质量
1 软件度量值指标 1.1 可维护性指数 表示源代码的可维护性,数值越高可维护性越好.该值介于0到100之间.绿色评级在20到100之间,表明该代码具有高度的可维护性:黄色评级在10到19之间,表示该 ...
- springboot整合shiro
请大家在看本文之前,先了解如下知识点: 1.Shiro 是什么?怎么用? 2.Cas 是什么?怎么用? 3.最好有Spring基础 可以先看看这两篇文章,按照这2篇文章的内容做一遍: Spring B ...
- YII2 models非常好用的控制输出数据【重写Fields】
models里重写Fields真的很好用,用于分类.评论功能 列子:评论表models/Comment.php 1.关联商品表 2.获取父级(即管理员)评论 public function Field ...
- 非关系型数据库redis-java基本操作
概述 redis是一个key-value的nosql数据库(非关系型数据库).支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set -- ...
- 初窥 MongoDB
最近在研究Nodejs 自然就接触到了MongoDB 这玩意儿有意思 与关系型数据库相比少了很多条条框框 让我情不自禁的想要了解它的所有 MongoDB与Redis同类 属于NoSql的一种,特点 ...
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...