介绍
MySQL 中的一种流程控制语法结构,用于在 SQL 查询中实现条件逻辑。它允许你根据一个或多个条件的真假来返回不同的值。可以根据某些条件对数据进行分类或者转换。
使用方式
简单 CASE 表达式
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[ ELSE else_result_expression ]
END
搜索 CASE 表达式。
CASE
WHEN boolean_expression THEN result_expression
[ ...n ]
[ ELSE else_result_expression ]
END
示例
# 建表
CREATE TABLE `sys_user` (
`id` VARCHAR(32) NOT NULL COMMENT '用户ID',
`name` VARCHAR(50) NOT NULL COMMENT '用户名',
`gender` CHAR(1) DEFAULT 'U' COMMENT '性别:M-男,F-女,U-未知',
`age` INT DEFAULT NULL COMMENT '年龄',
`status` VARCHAR(20) DEFAULT 'normal' COMMENT '状态:normal-正常,disabled-禁用,locked-锁定',
`login_count` INT DEFAULT 0 COMMENT '登录次数',
`department` VARCHAR(100) DEFAULT NULL COMMENT '部门',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) COMMENT='用户表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 数据
INSERT INTO sys_user (id, name, gender, age, status, login_count, department)
VALUES
('1', '张三', 'M', 25, 'normal', 120, '技术部'),
('2', '李四', 'F', 30, 'normal', 80, '市场部'),
('3', '王五', 'M', 45, 'disabled', 10, '财务部'),
('4', '赵六', 'F', 22, 'locked', 5, '人事部'),
('5', '钱七', 'U', 35, 'normal', 70, '技术部'),
('6', '孙八', 'M', 28, 'normal', 90, '市场部'),
('7', '周九', 'F', 24, 'normal', 60, '销售部'),
('8', '吴十', 'M', 38, 'disabled', 15, '研发部'),
('9', '郑十一', 'F', 26, 'locked', 3, '运维部'),
('10', '王十二', 'U', 40, 'normal', 100, '产品部'),
('11', '赵十三', 'M', 29, 'normal', 110, '技术部'),
('12', '钱十四', 'F', 32, 'disabled', 20, '市场部'),
('13', '孙十五', 'M', 27, 'normal', 85, '财务部'),
('14', '周十六', 'F', 23, 'locked', 7, '人事部'),
('15', '吴十七', 'U', 37, 'normal', 65, '销售部'),
('16', '郑十八', 'M', 31, 'normal', 95, '研发部'),
('17', '王十九', 'F', 25, 'disabled', 25, '运维部'),
('18', '赵二十', 'M', 34, 'normal', 105, '产品部'),
('19', '钱二十一', 'F', 28, 'locked', 8, '技术部'),
('20', '孙二十二', 'M', 33, 'normal', 75, '市场部');
具体操作
- 简单的条件判断
需求:根据用户的性别字段 gender,返回“男”或“女”。
SELECT
id,
name,
CASE gender
WHEN 'M' THEN '男'
WHEN 'F' THEN '女'
ELSE '未知'
END AS gender_desc
FROM
sys_user;
- 多条件判断
需求:根据用户的年龄字段 age,判断用户属于哪个年龄段。
SELECT
id,
name,
age,
CASE
WHEN age < 18 THEN '少年'
WHEN age >= 18 AND age < 30 THEN '青年'
WHEN age >= 30 AND age < 50 THEN '中年'
ELSE '老年'
END AS age_group
FROM
sys_user;
- 行转列
需求:统计 sys_user 表中不同状态(如正常、禁用、锁定)的用户数量。
SELECT
COUNT(*) AS total_users,
SUM(CASE WHEN status = 'normal' THEN 1 ELSE 0 END) AS normal_users,
SUM(CASE WHEN status = 'disabled' THEN 1 ELSE 0 END) AS disabled_users,
SUM(CASE WHEN status = 'locked' THEN 1 ELSE 0 END) AS locked_users
FROM
sys_user;
- 根据条件动态生成列值
需求:根据用户的登录次数 login_count,判断用户是否活跃
SELECT
id,
name,
login_count,
CASE
WHEN login_count > 100 THEN '非常活跃'
WHEN login_count > 50 THEN '活跃'
WHEN login_count > 10 THEN '一般活跃'
ELSE '不活跃'
END AS activity_level
FROM
sys_user;
结合聚合函数(聚合函数中使用条件判断)
需求:根据用户的部门 department,统计每个部门的用户数量,并标记部门是否为“大部门”(用户数大于 10)
SELECT
department,
COUNT(*) AS user_count,
CASE
WHEN COUNT(*) > 10 THEN '大部门'
ELSE '小部门'
END AS department_size
FROM
sys_user
GROUP BY
department;