MySQL的case

文章目录

环境

  • MySQL 8.0.34 (Linux CentOS)
  • MySQL Workbench 8.0 Community (Windows 11 家庭版)

case语法

case 有点类似于其它编程语言的 switch 语句,从多个条件分支中选择一个。

case 有两种写法:

  • case xxx when xxx then xxx ... else xxx end
  • case when xxx then xxx ... else xxx end

其中, else 分支是可选的。

select

第一种写法中, when 值是和前面 case 的值作比较。比如:

sql 复制代码
SELECT 
    CASE 1 + 1
        WHEN 1 THEN 'result = 1'
        WHEN 2 THEN 'result = 2'
        WHEN 3 THEN 'result = 3'
        ELSE 'result = none'
    END

运行结果是:

powershell 复制代码
result = 2

第二种写法中, when 值本身是一个布尔表达式。比如:

sql 复制代码
SELECT 
    CASE
        WHEN 1 + 2 < 0 THEN 'first'
        WHEN 2 + 3 = 5 THEN 'second'
        WHEN 3 + 4 >= 7 THEN 'third'
        ELSE 'unknown'
    END;

运行结果是:

powershell 复制代码
second

注意:在各分支之间,无需显式 break ,一旦匹配上,就会自动break出来。本例中,虽然第3种情况也正确,但已没有机会了。

where

case 不但可以用在 select 处,也可以用在别处,比如 whereorder by

假设 t1 表中记录了每个员工的部门和工资,现在要查询高工资的员工:

  • deptid为1的高工资标准是8000元
  • deptid为2的高工资标准是5000元
  • 对于其它部门,全部列出来

可以用 union all 来拼接多个查询结果:

sql 复制代码
select * from t1
where deptid = 1 and salary > 8000
union all
select * from t1
where deptid = 2 and salary > 5000
union all
select * from t1
where deptid <> 1 and deptid <> 2

也可以用 case 来实现:

sql 复制代码
SELECT * FROM t1
WHERE
    CASE deptid
        WHEN 1 THEN salary > 8000
        WHEN 2 THEN salary > 5000
        ELSE TRUE
    END;

order by

查询员工信息,要求:

  • deptid为1的员工按工资排序
  • deptid为2的员工按ID排序
  • 对于其它部门,按工资排序
sql 复制代码
SELECT * FROM t1
ORDER BY CASE deptid
    WHEN 1 THEN salary
    WHEN 2 THEN id
    ELSE salary
END;

注意:如果要添加 asc / desc ,只能在 case 之后添加,不能单独在每个 when 分支处添加。

如果其中一个分支想反序,对于数值类型,可以通过 xxx * (-1) 的方式实现,对于其它类型,好像没有简单方法。

考一考

现有 uchome_game 表,每条记录是一盘比赛,其外键有:

  • 该盘比赛的两个选手,分别是 uid1uid2

  • 该盘比赛所在的赛事ID eventid

现在,对指定的 uideventid ,查询这个选手在该赛事中的所有对手ID。

答:可以用 union 来实现:

sql 复制代码
select uid1 as uid from uchome_game where uid2 = 110785 and eventid = 92767
union
select uid2 as uid from uchome_game where uid1 = 110785 and eventid = 92767;

也可以用 case 来实现:

sql 复制代码
SELECT DISTINCT
    CASE
        WHEN uid1 = 110785 THEN uid2
        ELSE uid1
    END AS uid
FROM
    uchome_game
WHERE
    eventid = 92767 AND (uid1 = 110785 OR uid2 = 110785)

注意:第一个SQL不需要 distinct ,因为 union 会去重。第二个SQL需要用 distinct 去重。

相关推荐
2401_8734794032 分钟前
如何识别代理IP和伪装流量?用IP情报工具三步穿透住宅代理伪装
网络·数据库·网络协议·tcp/ip·ip
诚信定制83939 分钟前
如何启动 Redis 服务:详细步骤指南
数据库·redis·缓存
AllData公司负责人40 分钟前
数据同步平台|AIIData数据中台实现MySQL、Hive、Kafka 一键接入Doris
大数据·数据库·hive·mysql·kafka·实时同步
数据库小学妹41 分钟前
MySQL安全加固全流程:网络隔离、TDE加密、数据脱敏、等保合规7步实战
mysql·安全·数据脱敏·审计日志·安全加固·等保合规
Edward1111111143 分钟前
一AI名词
java·开发语言·数据库·学习
hey you~1 小时前
400电话选型技术测评:一个开发视角的线路质量评估方案
运维·网络·数据库·400电话·企业通信
Database_Cool_1 小时前
实时计数器/排行榜首选:阿里云 Tair 高并发数据结构实践
数据结构·数据库·阿里云·云计算
言乐61 小时前
Python视频相对亮度检测
数据库·python·计算机视觉·小程序·音视频
snow@li1 小时前
中台:中台即复用 / 理解企业架构中的能力抽象与分层共享 / 中台体系全景梳理 / 共性能力抽象、沉淀并复用
数据库
SelectDB技术团队2 小时前
AB 实验指标计算场景:Apache Doris / SelectDB 的技术能力、选型对比与实践
大数据·数据库·数据分析·apache·用户运营·apache doris·selectdb