case when then else_SQL 优化大神玩转 MySQL函数系列_case_when 的坑

大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

今天给大家带来的 在MySQL,Oracle 都通用的一个非常基础的但是非常重要的函数

case when

我们看下如下表和数据

v2-27f457fa340d7b91fa43de87252f96d3_b.jpg

在这里我们通过case when 语句 制造一个列如下

v2-757376e07a8ff12c3d6e3c27f202f987_b.jpg

这样我们就写了一个最基本的case when 语句。

下面的链接是官方文档

https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#operator_case

这个函数给我们提供了如Java或者其他编程语言的 if..else 语法一样的效果的函数,使得我们写SQL如同编程一样。

但是这个函数在MySQL和Oracle中有共同注意的地方和个别注意的地方。

共同注意的地方:

这个函数是顺序执行的,所以我们每个条件之间不能有交集,这一点非常重要

v2-a8cdfed6eb560e6f0804239e09e2c2ef_b.jpg

如上图所示,这里的 when emp_no = 30970 then 'd530970'

这个条件跟上面的 dept_no='d005' then 'd5' 是有重复的所以在第一行的时候

就都过滤掉了,永远不会走第二行

v2-5796d0838a4becd93e1562f77c605590_b.jpg

但是如上图,我们把两个顺序调换了,结果跟我们想要的结果一样了,因为第一个when和第二个when虽然有交集,但是第二个when的范围比第一个大,所以交集之外的走了第二个when ,所以,如果你们碰到有交集的情况,那必须把范围较少的放在前面。

下面的是在MySQL中没有问题,但是在Oracle中报错的例子。

Oracle

v2-d22ce9baaf2a0dd06afe134353fecf8d_b.jpg

MySQL

v2-77bb164dfe26302c7472a0b1b3cb2a3c_b.jpg

这个案例非常简单,但是也给我们有很多提示,Oracle 对语法更加严格,而MySQL 显然更不容易报错。

下面是修改之后的Oracle 能运行出来的

v2-6883ce7eef220a83362d580ad33ffa70_b.jpg

今天的案例就单纯的从case when的 基本语法出发,着重讲了很容易犯错的地方,

所谓的复杂的SQL,我认为就是在这基础上添加了group by 还有几个join 所以我们必须把基础打捞才可以应付更加复杂的SQL.

谢谢大家~ 欢饮转发

我的微信公众号:SQL开发与优化(sqlturning)

我会在头条提供相应例子的视频,希望大家关注

头条号

v2-4b69d711875ebaa39a50d6599e83eb50_b.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值