SQL-----CASE表达式

本文深入解析SQL中的CASE表达式,包括简单CASE和搜索CASE两种形式的使用方法,以及在数据转换、条件统计和表间数据匹配等场景下的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CASE表达式有两种写法:简单CASE表达式、搜索CASE表达式

-- 简单 CASE 表达式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- 搜索 CASE 表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

在发现为 真 的 WHEN子句时,CASE表达式的真假判断就会终止,而剩余的子句会被忽略。

注意事项:

1.统一各分支返回的数据类型

2.不要忘了写END

3.养成写ELSE子句的习惯(不写 ELSE 子句时,CASE 表达式的执行结果是 NULL。

常见用法:

1.将已有编号方式转换为新的方式并统计

统计数据源表PopTbl

-- 把县编号转换成地区编号 (1)
SELECT CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END AS district,
SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
WHEN '德岛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '爱媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福冈' THEN '九州'
WHEN '佐贺' THEN '九州'
WHEN '长崎' THEN '九州'
ELSE '其他' END;

这里的关键在于将 SELECT 子句里的 CASE 表达式复制到 GROUP BY子句里。在MySQL中也可以用别名

统计结果:

2.用一条 SQL 语句进行不同条件的统计
统计源表 PopTbl2

SELECT pref_name,
-- 男性人口
SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
-- 女性人口
SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f
FROM PopTbl2
GROUP BY pref_name;


3.表之间的数据匹配


用这两张表来生成下面这样的交叉表,以便于一目了然地知道
每个月开设的课程。

-- 表的匹配 :使用 IN 谓词
SELECT course_name,
CASE WHEN course_id IN
    (SELECT course_id FROM OpenCourses
        WHERE month = 200706) THEN '○'
        ELSE '×' END AS "6 月",
CASE WHEN course_id IN
    (SELECT course_id FROM OpenCourses
        WHERE month = 200707) THEN '○'
        ELSE '×' END AS "7 月",
CASE WHEN course_id IN
    (SELECT course_id FROM OpenCourses
        WHERE month = 200708) THEN '○'
        ELSE '×' END AS "8 月"
FROM CourseMaster;

-- 表的匹配 :使用 EXISTS 谓词
SELECT CM.course_name,
    CASE WHEN EXISTS
            (SELECT course_id FROM OpenCourses OC
                WHERE month = 200706
                AND OC.course_id = CM.course_id) THEN '○'
        ELSE '×' END AS "6 月",
    CASE WHEN EXISTS
            (SELECT course_id FROM OpenCourses OC
                WHERE month = 200707
                AND OC.course_id = CM.course_id) THEN '○'
        ELSE '×' END AS "7 月",
    CASE WHEN EXISTS
            (SELECT course_id FROM OpenCourses OC
                WHERE month = 200708
                AND OC.course_id = CM.course_id) THEN '○'
        ELSE '×' END AS "8 月"
FROM CourseMaster CM;


来自《SQL进阶教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值