SQL关键字快速入门:CASE 实现条件逻辑

在处理数据时,我们经常需要根据不同的条件来决定显示或计算哪些值。例如:

  • 根据分数段给学生评分等级;
  • 按照订单金额划分客户级别;
  • 对某些特定值进行重命名或分类。

这时候,我们就需要用到 SQL 中非常强大的一个关键字 ------ CASE

它允许我们在查询中实现类似于编程语言中的条件判断(如 if-else),从而让查询结果更加灵活和智能。


一、什么是 CASE?

CASE 是 SQL 中用于实现条件逻辑的关键字。它可以根据指定的条件返回不同的值,非常适合用来进行数据分类、转换等操作。

你可以把它理解为:"如果满足这个条件,则返回某个值;否则返回另一个值"。

case when的正确语法是: case when ... then ... when ... then ... else ... end,case和end不能缺少。


二、基本语法

SQL 提供了两种形式的 CASE 表达式:

简单 CASE 表达式

sql 复制代码
CASE input_expression
    WHEN expression1 THEN result1
    WHEN expression2 THEN result2
    ...
    ELSE default_result
END
  • input_expression 等于某个 expression 时,返回对应的 result
  • 如果没有匹配项,则返回 ELSE 后面的默认值。

搜索 CASE 表达式

sql 复制代码
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END
  • 可以使用任意的布尔表达式作为条件。
  • 返回第一个满足条件的结果,如果没有条件满足,则返回 ELSE 后面的默认值。

三、示例讲解

假设我们有一个 students 表,记录了学生的考试成绩:

id name score
1 张三 85
2 李四 90
3 王五 70
4 赵六 50

示例1:简单 CASE 表达式 - 根据分数划分等级

vbnet 复制代码
SELECT name, score,
CASE score
    WHEN 90 THEN '优秀'
    WHEN 80 THEN '良好'
    WHEN 70 THEN '合格'
    ELSE '不合格'
END AS grade
FROM students;

结果:

name score grade
张三 85 NULL
李四 90 优秀
王五 70 合格
赵六 50 不合格

注意:在这个例子中,因为张三的成绩是85分,并不直接等于任何一个 WHEN 分支的值,所以他的等级显示为 NULL


示例2:搜索 CASE 表达式 - 更灵活的条件判断

vbnet 复制代码
SELECT name, score,
CASE
    WHEN score >= 90 THEN '优秀'
    WHEN score >= 80 THEN '良好'
    WHEN score >= 60 THEN '合格'
    ELSE '不合格'
END AS grade
FROM students;

结果:

name score grade
张三 85 良好
李四 90 优秀
王五 70 合格
赵六 50 不合格

使用搜索 CASE 表达式可以更灵活地处理范围条件。


示例3:结合聚合函数使用

假设我们有一个 orders 表,记录了订单信息:

order_id customer_id amount
1 1 2999
2 2 499
3 1 199
4 3 899

我们可以用 CASE 来统计每个客户的订单总额,并根据金额划分客户级别:

sql 复制代码
SELECT customer_id,
SUM(amount) AS total_amount,
CASE
    WHEN SUM(amount) > 1000 THEN '高级客户'
    WHEN SUM(amount) BETWEEN 500 AND 1000 THEN '中级客户'
    ELSE '普通客户'
END AS customer_level
FROM orders
GROUP BY customer_id;

结果:

customer_id total_amount customer_level
1 3198 高级客户
2 499 普通客户
3 899 中级客户

注意

  • CASE 表达式必须包含至少一个 WHEN 子句,并且通常包含一个 ELSE 子句来处理未匹配的情况。
  • 在性能方面,尽量使 CASE 表达式的条件尽可能具体,避免过多的嵌套,以免影响查询效率。
  • CASE 可以与 SELECT, WHERE, ORDER BY 等子句一起使用,增加查询的灵活性。

四、总结对比表

场景 SQL 示例
根据具体值划分等级 CASE score WHEN 90 THEN '优秀' ... END
根据条件范围划分等级 CASE WHEN score >= 90 THEN '优秀' ... END
结合聚合函数使用 SELECT customer_id, SUM(amount), CASE WHEN ... END FROM orders GROUP BY customer_id;

如果这篇文章对大家有帮助可以点赞关注,你的支持就是我的动力😊!

相关推荐
qq_3643717216 分钟前
基于 Redis + JWT 的跨系统身份共享方案
数据库·redis
技术与健康32 分钟前
LLM实践系列:利用LLM重构数据科学流程04 - 智能特征工程
数据库·人工智能·重构
007php0071 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
运维·数据库·git·docker·微服务·自动化·jenkins
北极糊的狐1 小时前
MySQL常见报错分析及解决方案总结(1)---Can‘t connect to MySQL server on ‘localhost‘(10061)
数据库·mysql
TimelessHaze1 小时前
🔥 一文掌握 JavaScript 数组方法(2025 全面指南):分类解析 × 业务场景 × 易错点
前端·javascript·trae
阿里云大数据AI技术2 小时前
ODPS 十五周年实录 | Data + AI,MaxCompute 下一个15年的新增长引擎
大数据·python·sql
SelectDB2 小时前
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
大数据·数据库·数据分析
SelectDB2 小时前
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
数据库·开源·github
EndingCoder2 小时前
React 19 与 Next.js:利用最新 React 功能
前端·javascript·后端·react.js·前端框架·全栈·next.js
ITMan彪叔2 小时前
Nodejs打包 Webpack 中 __dirname 的正确配置与行为解析
javascript·后端