千家信息网

MySQL中case when对NULL值判断的踩坑分析

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇内容介绍了"MySQL中case when对NULL值判断的踩坑分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
千家信息网最后更新 2025年01月18日MySQL中case when对NULL值判断的踩坑分析

本篇内容介绍了"MySQL中case when对NULL值判断的踩坑分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

在开发程序中,从MySQL中提取数据的时候,使用到了case when的语法用来做判断,在使用过程中在判断NULL值的时候遇到个小问题

sql中的case when 有点类似于Java中的switch语句,比较灵活,但是在Mysql中对于Null的处理有点特殊

Mysql中case when语法:

语法1:

CASE case_value    WHEN when_value THEN statement_list    [WHEN when_value THEN statement_list] ...    [ELSE statement_list]END CASE

语法2:

CASE    WHEN search_condition THEN statement_list    [WHEN search_condition THEN statement_list] ...    [ELSE statement_list]END CASE

注意: 这两种语法是有区别的,区别如下:

1:第一种语法:case_value必须是一个表达式,例如 userid%2=1或者username is null等。该种语法不能用于测试NULL。

2:第二种语法CASE后面不需要变量或者表达式,直接执行时候评估每一个WHEN后面的条件,如果满足则执行。

案例实战:

表结构如下:a 值为null, b值为1

mysql> SELECT NULL AS a, 1 AS b;+------+---+| a    | b |+------+---+| NULL | 1 |+------+---+

现在实现,如果a值为null 则取b值,否则取a值

方法1: ifnull 用法

SELECT    IFNULL(a, b) AS new,    a,    bFROM    -- 创建临时表: a 的值为null ,b为1    (SELECT NULL AS a, 1 AS b) tmp;

方法2: case when 用法

SELECT    (        CASE a        WHEN a IS NULL THEN            b        ELSE            a        END    ) AS new,    a,    bFROM    (SELECT NULL AS a, 1 AS b) tmp;

发现得到的结果不对,new 的值居然为null ,而不是我们想要的1.

为什么会出现这个错误呢?是将第一种语法与第二种语法混用导致的,case 后面commission_pct 的值有两种:真实值或者为null,而 when 后面的commission_pct is null 也有两个值:true或者false,所以case 后面为null时候永远无法跟true或false匹配,因此输出不为null。

对于该种情况如果必须要用语法1的话可以如下改写:

SELECT    (        CASE a IS NULL        WHEN TRUE THEN b        ELSE a                 END    ) AS new,    a,    bFROM    (SELECT NULL AS a, 1 AS b) tmp;

也可以使用语法2写:

SELECT    (        CASE        WHEN a is NULL  THEN b         ELSE a         END    ) AS new,    a,    bFROM    (SELECT NULL AS a, 1 AS b) tmp;

注意另一种可能存在错误却不容易发现错误的情况:

SELECT    (        CASE a        WHEN NULL THEN b        ELSE a                 END    ) AS new,    a,    bFROM    (SELECT NULL AS a, 1 AS b) tmp;

看似没有问题,实际有问题,问题原因就是null的判断不能用=进行判断。简单说就是:语法1中的case表达式的值与后面的when的值使用的=进行判等,但是mysql中必须使用is 或者is not。

"MySQL中case when对NULL值判断的踩坑分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

语法 时候 问题 情况 表达式 错误 分析 内容 实际 就是 方法 更多 案例 知识 过程 输出 不对 实用 特殊 学有所成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国家计算机网络安全中心职能 使用国泰安数据库教程 郑州工程技术学院软件开发 朝阳区正规软件开发价格信息 逃出生天ae服务器连接不上 丹东市网络安全应急指挥中心 用手机可以管理服务器吗 软件开发一年后工资多少 数据库数据提交的语句是 哪些网络技术可以入股 苹果手机玩传奇4连不上服务器 北京无限网络技术有限公司 网络安全法规定哪些制度 .net空间数据库 郑州网络安全科技馆讲解员 嵌入式软件开发主要是 无锡租房网络安全 打印标签软件怎么样连接数据库 深圳新媒易网络技术有限公司咋样 比亚迪程序软件开发助理 网络安全和信息化工作主要做法 c 新建db数据库 山西职业软件开发系统 2021高考博雅数据库 亿云网络技术有限公司 程序跟数据库如何连接 量化交易软件开发费用 方舟手游联机服务器怎么获得 元气骑士哪一个服务器人最多 苹果有多少icloud服务器
0