‌CASE WHEN THEN ELSE END‌

CASE WHEN THEN ELSE END‌ 是SQL中实现条件逻辑的核心表达式,支持单字段匹配和多条件判断,适用于数据处理、分类统计等场景。

基本语法形式

SQL中CASE表达式有两种标准形式:

1‌  简单CASE表达式‌(字段直接匹配)

CASE 字段
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
ELSE 默认结果
END

示例:CASE gender WHEN 'M' THEN '男' ELSE '未知' END‌‌1‌‌2

2‌、搜索CASE表达式‌(支持复杂条件)。

CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 默认结果
END

示例:CASE WHEN salary>5000 THEN '高收入' WHEN salary>3000 THEN '中等收入' ELSE '低收入' END‌‌  3‌‌   4 

核心功能特性

  • 短路执行机制‌:仅返回首个满足条件的THEN结果,后续条件不再评估。‌‌5‌‌6
  • ELSE可选性‌:省略ELSE子句时默认返回NULL。‌‌7
  • 结果类型一致性‌:所有THEN结果和ELSE结果必须保持相同数据类型。‌‌8

典型应用场景

1‌  数据分类标注‌。

SELECT product_name,
CASE WHEN price > 100 THEN '高价商品'
WHEN price > 50 THEN '中价商品'
ELSE '平价商品'
END AS price_level
FROM products;
2.动态分组统计‌。

SELECT
CASE WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 60 THEN '成年人'
ELSE '老年人'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY age_group;
3‌  条件聚合计算‌。

SELECT department,
SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS total_completed,
SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS total_pending
FROM orders
GROUP BY department;

NULL值处理‌:需显式使用IS NULL判断,如WHEN field IS NULL THEN '空值'‌‌11

### SQL 中 `CASE WHEN THEN ELSE END` 和 `HAVING` 子句的用法 #### 使用 `CASE WHEN THEN ELSE END` 在SQL查询中,`CASE WHEN THEN ELSE END` 是一种用于实现条件逻辑的强大工具。此结构允许基于不同条件返回不同的值[^2]。 例如,在统计学生选课数量和总成绩时可以使用 `CASE WHEN THEN ELSE END` 来处理可能存在的空值情况: ```sql SELECT a.s_id, a.s_name, COUNT(b.c_id), SUM(CASE WHEN b.s_score IS NOT NULL THEN b.s_score ELSE 0 END) AS total_score FROM student AS a LEFT JOIN score AS b ON a.s_id = b.s_id GROUP BY a.s_id, a.s_name; ``` 这段代码通过 `CASE WHEN THEN ELSE END` 结构来确保当分数为空时不计入总分计算之中[^3]。 #### 使用 `HAVING` 子句 `HAVING` 子句通常与聚合函数一起使用,用来过滤由 `GROUP BY` 创建的结果集中的记录组。它类似于 `WHERE` 子句,但是作用于已经完成分组的数据上。 考虑这样一个场景:想要找出至少选择了两门课程的学生及其平均成绩超过85分的情况,则可以在上述基础上加入 `HAVING` 进行筛选: ```sql SELECT a.s_id, a.s_name, COUNT(b.c_id) AS course_count, AVG(CASE WHEN b.s_score IS NOT NULL THEN b.s_score ELSE 0 END) AS avg_score FROM student AS a LEFT JOIN score AS b ON a.s_id = b.s_id GROUP BY a.s_id, a.s_name HAVING COUNT(b.c_id) >= 2 AND AVG(CASE WHEN b.s_score IS NOT NULL THEN b.s_score ELSE 0 END) > 85; ``` 这里不仅应用了 `CASE WHEN THEN ELSE END` 处理潜在缺失数据的问题,还利用 `HAVING` 对最终结果进行了进一步限定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lifewange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值