今天在学习时,碰到一个问题:在联表查询取得结果后,如果取得的结果是空值,则给一个默认值,如果不是空值,则返回这个值。

下面我们来看看业务场景:

在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字段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); ...

随机推荐

DayPilot 7.8 DLL去DEMO字样下载

来自 DayPilot 的 7.8.3169.1 版本的DLL,微调去掉了“DEMO”字样,供参考,商用请支持正版! 此处下载: http://files.cnblogs.com/files/pcca ...

PHP 配置文件详解(php.ini 详解 )

[PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;; ...

OkHttp使用进阶 译自OkHttp Github官方教程

版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/3997368.html 没有使用过OkHttp的,可以先看Ok ...

pthread_attr_t 线程属性(一)

1.    线程属性:             使用pthread_attr_t类型表示,我们需要对此结构体进行初始化,                 初始化后使用,使用后还要进行去除初始化!    ...

搭建自己的hexo博客

这是我最近用hexo搭建的个人博客,欢迎来参观留言,以下是我创建这个hexo的一步步步骤,欢迎指正! 我的博客 参考自 潘柏信的博客;CnFeat 主题参考这里 pacman; 主题选自这里 hexa ...

window bat 切换目录并执行php文件

新建一个 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 ...

mysql ifnull 无效_关于MySql中使用IFNULL()函数失效的问题。相关推荐

  1. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  2. OpenCv中,waitkey()函数失效原因

    OepnCv库中,waitkey函数失效原因 情景描述 原因 HighGUI 函数 情景描述 在写一个自动化脚本,然后再某一个循环里,使用了如下代码: while True:# ord 函数, 根据键 ...

  3. mysql 显示用户_在Mysql中如何显示所有用户?

    这是一个mysql初学者经常问到的一个问题,今天我们就带大家看看是如何在Mysql中显示所有用户的.通常我们在mysql中使用SHOW DATABASES可以显示所有的数据库,SHOW TABLES将 ...

  4. mysql 查数据 default无效_导入mysql数据的时候提示Field * doesn't have a default value解决方法...

    项目使用django+mysql 在linux中使用的是mysql5.7,导入数据提示:Field * doesn't have a default value 想要解决问题就需要知道在mysql5. ...

  5. 删除+mysql+用户密码_误删除mysql中的所用用户,如何重新设置root账号和密码

    在练习mysql语句的时候,使用delete将数据库中的所有用户删除了,其中也包括root用户.并进行了flush privileges:这时候发现重新登入mysql已经不能正常登陆.对此我们要重新设 ...

  6. mysql binlog跟踪_在MySQL中使用init-connect与binlog来实现用户操作追踪记录

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 分类: MySQL 前言: 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查 ...

  7. mysql fulltext 分词_在mysql中使用全文索引fulltext|mysql,全文索引,fulltext

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于   MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREAT ...

  8. linux mysql 打补丁_一步到位Linux中安装配置MySQL及补坑

    Windows上安装MySQL也就不讲了,基本上一路点击下一步就可完成,现在讲讲Linux上布署Mysql,虽然也有很多网友列出了详细的步骤,可能是因为版本过老的问题导致即使按照上面一步步来也还是出现 ...

  9. mysql语句命令_常用MySQL语句(命令行)

    # 命令行客户端MySQLMySQL是一个关系型数据库管理系统 安装MySQL服务端软件使用: sudo apt-get install mysql-server 安装MySQL客户端软件使用: su ...

最新文章

  1. 【bzoj2081】[Poi2010]Beads Hash
  2. .Net Core with 微服务 - Consul 注册中心
  3. [react] 说说你喜欢react的原因是什么?它有什么优缺点?
  4. 双目相机--双目视差与深度距离关系推导详解
  5. (前端)html与css css 19、tab栏
  6. Makefile--基本规则(零)
  7. 霍金警告人工智能危险性 称其若失控很难被阻止
  8. HFSS天线设计过程学习笔记
  9. VSCode 设置为 Monaco字体
  10. matlab 16位直方图均衡化,matlab 直方图均衡化
  11. 【数据分析师3级】 数据挖掘方法论
  12. 程序员不能错过的20个学习网站
  13. Authorization Basic认证 笔记
  14. 大学十年(一个程序员的路程)(林锐博士)《1----9》【林锐的大学10年】
  15. 倡议书格式范文_写倡议书的格式及范文
  16. 蒙特卡罗模拟赌徒人生
  17. php 实现 js escape unescape
  18. mysql redis 点赞_Redis 实现点赞功能
  19. Excel万金油公式IINDEX-SMALL-IF-ROW-超级匹配
  20. Log4j日志级别及使用规范

热门文章

  1. Android学习之轻量级数据库SQLite
  2. c# winform LED数字时钟控件
  3. Linux查看CPU信息(CPU个数、核心数、CPU使用率、运行位数)
  4. 在python -m spacy download en出现错误
  5. 网页动态背景——随鼠标变换的动态线条
  6. 接口测试(筑基期>>>结丹期)
  7. Gbps Mbps Bps bps之间的进制转换
  8. [Git]Enter passphrase 密码不对的解决办法
  9. 100个网络基础知识简答
  10. 100道Python实例练手题目