专栏首页用户1337634的专栏MySQL - CASE WHEN的高级用法

MySQL - CASE WHEN的高级用法

看起来类似于程序语言中Switch Case多条件匹配语法,可以实现很多高级功能

Case语法

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

预制数据

mysql> select * from person;
+----+---------+--------+------+--------+
| id | country | name   | age  | gender |
+----+---------+--------+------+--------+
|  3 | china   | tim    |   10 |      1 |
|  7 | usa     | kobe   |   10 |      1 |
|  8 | usa     | james  |   20 |      1 |
|  9 | usa     | grace  |   30 |      0 |
| 10 | japan   | monica |   40 |      2 |
+----+---------+--------+------+--------+

Case的场景示例


根据字段查询分组结果

mysql> SELECT id, `name`,  CASE gender WHEN 1 THEN '男'  WHEN 0 THEN '女'  ELSE '其他' END AS gender FROM person;
+----+--------+--------+
| id | name   | gender |
+----+--------+--------+
|  3 | tim    | 男     |
|  7 | kobe   | 男     |
|  8 | james  | 男     |
|  9 | grace  | 女     |
| 10 | monica | 其他   |
+----+--------+--------+

分组统计

  • 根据不同国家统计用户的性别
mysql> select country, 
    -> sum(case when gender=1 then 1 else 0 end) as male, 
    -> sum( case when gender=0 then 1 else 0 end) as female, 
    -> sum(case when gender>1 then 1 else 0 end) as unknown 
    -> from person 
    -> group by country;
+---------+------+--------+---------+
| country | male | female | unknown |
+---------+------+--------+---------+
| china   |    1 |      0 |       0 |
| japan   |    0 |      0 |       1 |
| usa     |    2 |      1 |       0 |
+---------+------+--------+---------+

批量更新

  • 简单Case函数
UPDATE person 
SET `status` = CASE id
WHEN 1 THEN 1
WHEN 2 THEN 0
WHEN 3 THEN 0
WHEN 4 THEN 1
END
WHERE id IN (1, 2, 3, 4)

注意事项:一定要有WHERE id IN的限制,否则不在WHEN中的记录就会被置为NULL

  • Case搜索函数
UPDATE person 
SET `status` = CASE 
WHEN id%2=1 THEN 1
WHEN id%2=0 THEN 0
END

区别:简单Case函数只能实现相等条件判断,Case搜索函数适合复杂条件判断,比如大于、小于等

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java获取本机IP

    过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头;再过滤回环地址,并要求是内网地址(非外网)

    十毛
  • [转]写好shell脚本的13个技巧

    作者|Joseph Matthias Goh 译者丨无明 编辑|张婵 高效开发运维公众号

    十毛
  • Class.getResource与ClassLoader.getResource的区别

    可以看出来了,Class.getResource最后其实也是通过ClassLoader.getResource获取资源,只是在之前先把路径做了一次修改。修改的规...

    十毛
  • Zipper_Haskell笔记13

    数据结构不可变,所以对其进行增、删、改等操作的结果只能是重新创建一份新的数据结构,例如:

    ayqy贾杰
  • Java编程常见问题汇总2

    这里有一个前提,就是文件大小不能讲JVM的heap撑爆。否则就等着OOM吧,尤其是在高并发的服务器端代码。最好的做法是采用Stream的方式边读取边存储(本地文...

    哲洛不闹
  • 【Rust日报】2020-05-11 Rust分布式并发编程; 能比Go语言的Goroutines牛吗?

    Rust concurrency: the single-writer principle An example of applying the single-...

    MikeLoveRust
  • 适配器模式与SpringMVC

    适配器模式是将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作...

    java技术爱好者
  • Swift:轻量级API的设计(一)

    Swift的最强大功能之一就是在设计API方面给我们提供了极大的灵活性。这种灵活性不仅使我们能够定义易于理解和使用的函数和类型,还使我们能够创建给人以非常轻量级...

    韦弦zhy
  • 【Rust日报】2019-12-29 - ​你不能用任何一种语言写与C媲美的程序(除了Rust)

    推荐文章,在本系列的这一部分中,作者将未经过优化的C程序转化为未经优化的 unsafe Rust 程序,后者与原始结果有相同的结果,并且具有相同的性能。作者从从...

    MikeLoveRust
  • 案例:能否借助AI破译婴儿哭声?

    作者:于长弘 全文共 4646 字 14 图,阅读需要 10 分钟 ———— / BEGIN / ———— 哭闹是宝宝表达情感和寻求帮助的主要方式,也是一种健康...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券