MySQL-CASE WHEN条件语句

发布于:2025-04-23 ⋅ 阅读:(36) ⋅ 点赞:(0)

介绍

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, '市场部');
具体操作
  1. 简单的条件判断
    需求:根据用户的性别字段 gender,返回“男”或“女”。
SELECT
    id,
    name,
    CASE gender
        WHEN 'M' THEN '男'
        WHEN 'F' THEN '女'
        ELSE '未知'
    END AS gender_desc
FROM
    sys_user;
  1. 多条件判断
    需求:根据用户的年龄字段 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;
  1. 行转列
    需求:统计 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;
  1. 根据条件动态生成列值
    需求:根据用户的登录次数 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;

网站公告

今日签到

点亮在社区的每一天
去签到