mysqlifnull⽆效_关于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()函数判断空值
我们知道,在不同的数据库引擎中,内置函数的实现.命名都是存在差异的,如果经常切换使⽤这⼏个数据库引擎的话,很容易会将这些函数弄混淆. ⽐如说判断空值的函数,在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字段,,现在要查这个.我们⽤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); ...
随机推荐
DayPilot 7.8 DLL去DEMO字样下载
PHP 配置⽂件详解(php.ini 详解 )
[PHP] ; PHP还是⼀个不断发展的⼯具,其功能还在不断地删减 ; ⽽php.ini的设置更改可以反映出相当的变化, ; 在使⽤新的PHP版本前,研究⼀下php.ini会有好处的 ;;;;;;;; ...
OkHttp使⽤进阶 译⾃OkHttp Github官⽅教程
pthread_attr_t 线程属性(⼀)
1.    线程属性:            使⽤pthread_attr_t类型表⽰,我们需要对此结构体进⾏初始化,                初始化后使⽤,使⽤后还要进⾏去除初始化!    ...
搭建⾃⼰的hexo博客
这是我最近⽤hexo搭建的个⼈博客,欢迎来参观留⾔,以下是我创建这个hexo的⼀步步步骤,欢迎指正! 我的博客 参考⾃ 潘柏信的博
客;CnFeat 主题参考这⾥ pacman; 主题选⾃这⾥ hexa ...
window bat 切换⽬录并执⾏php⽂件
isnull的用法
新建⼀个 test.bat⽂件,输⼊⼀下命令并保存 cmd /k "cd /d D:\PHPWAMP_IN2\phpwamp\server\Nginx-PHPWNMP\htdocs\test ...
Ionic Tabs使⽤
1. 创建Tabs相关页⾯ ionic g page tabs ionic g page TabOne ionic g page TabTwo ionic g page TabThree
2. 在ta ...
.Net Core 跨平台应⽤使⽤串⼝、串⼝通信 ,可能出现的问题、更简洁的实现⽅法
前些天在学习在 .NET Core下,跨平台使⽤串⼝通讯,有⼀篇⽂章说到在Linux/物联⽹下,实现通讯. 主要问题出现在以下两个类库SerialPortStream flyfire.CustomS ...
29 A Quick Guide to Go's Assembler 快速指南汇编程序:使⽤go语⾔的汇编器简介
A Quick Guide to Go's Assembler 快速指南汇编程序:使⽤go语⾔的汇编器简介 A Quick Guide to Go's Assembler Constants Symb ...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。