0

0

SQL条件判断怎么写_CASEWHEN逻辑分支完整示例【教学】

舞夢輝影

舞夢輝影

发布时间:2025-12-18 17:29:02

|

550人浏览过

|

来源于php中文网

原创

SQL中CASE WHEN是实现条件判断的核心语法,分简单CASE(直接匹配字段值)和搜索CASE(使用布尔表达式),后者更常用;按顺序逐条判断,遇首个TRUE即返回结果,THEN后类型宜一致,ELSE用于兜底防NULL。

sql条件判断怎么写_casewhen逻辑分支完整示例【教学】

SQL 中的 CASE WHEN 是实现条件判断的核心语法,类似编程语言里的 if-else,用于在查询中动态生成字段值、分类汇总、数据清洗等场景。它有两种写法:简单 CASE 和搜索 CASE,日常用得最多、最灵活的是后者(即带布尔表达式的 CASE WHEN ... THEN ... END)。

基础语法结构(搜索 CASE)

这是最常用、最推荐掌握的形式:

CASE
  WHEN 条件1 THEN 结果1
  WHEN 条件2 THEN 结果2
  WHEN 条件3 THEN 结果3
  ELSE 默认结果  -- 可选,不写则为 NULL
END AS 别名

注意:
• 条件按顺序从上到下逐条判断,**遇到第一个为 TRUE 的条件就返回对应结果,后续不再执行**;
• 所有 THEN 后的结果数据类型最好一致(如都是字符串或都是数字),否则数据库可能隐式转换或报错;
• ELSE 很重要——没匹配到任何 WHEN 时,它兜底,避免字段出现 NULL(尤其做统计或导出时)。

实际业务场景示例

假设有一张订单表 orders,含字段:order_idamountstatus('paid'/'shipped'/'cancelled')、created_at

Removal.AI
Removal.AI

AI移出图片背景工具

下载
  • 按金额分档标记客户等级
    CASE
      WHEN amount >= 5000 THEN 'VIP'
      WHEN amount >= 1000 THEN 'Gold'
      WHEN amount > 0    THEN 'Normal'
      ELSE 'Invalid'
    END AS customer_tier
    
  • 状态码转为中文描述,并统一空/异常值
    CASE status
      WHEN 'paid'      THEN '已支付'
      WHEN 'shipped'   THEN '已发货'
      WHEN 'cancelled' THEN '已取消'
      ELSE '状态未知'
    END AS status_desc
    
    (这是「简单 CASE」写法,适用于直接匹配某字段的离散值)
  • 组合条件 + 时间逻辑(判断是否逾期)
    CASE
      WHEN status = 'shipped' AND created_at < DATE_SUB(NOW(), INTERVAL 7 DAY)
        THEN '超时未签收'
      WHEN status = 'paid' AND created_at < DATE_SUB(NOW(), INTERVAL 3 DAY)
        THEN '待发货超时'
      ELSE '处理中'
    END AS process_alert
    

嵌套 CASE 和常见避坑点

CASE 表达式可嵌套,但建议控制深度(一般不超过 2 层),否则可读性骤降。更推荐拆成子查询或 CTE。

  • ❌ 错误:WHERE 中直接写 CASE 判断(语法错误)
    WHERE CASE WHEN amount > 100 THEN 'high' END = 'high' → 应改用标准布尔表达式:WHERE amount > 100
  • ✅ 正确:CASE 只用于 SELECT、ORDER BY、GROUP BY(部分数据库支持)、HAVING 中的表达式位置
  • ⚠️ 注意 NULL 比较:status = NULL 永远为 FALSE,要用 status IS NULL;CASE 中也一样,判空请用 WHEN status IS NULL THEN ...
  • ? 小技巧:在 ORDER BY 中用 CASE 实现自定义排序,比如把 'cancelled' 排最后:
    ORDER BY 
      CASE status 
        WHEN 'paid' THEN 1 
        WHEN 'shipped' THEN 2 
        ELSE 3 
      END
    

MySQL / PostgreSQL / SQL Server 都支持,写法基本一致

只有细微差异:
• PostgreSQL 支持 CASE WHEN ... THEN ... ELSE ... END 作为函数直接调用(如 (CASE WHEN x>0 THEN 1 ELSE 0 END)::BOOLEAN);
• SQL Server 允许在 UPDATE 的 SET 子句中直接用 CASE 赋值;
• 所有主流数据库都支持在聚合函数内使用,例如:

COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_count
(这种写法比 WHERE 过滤更灵活,适合多维度统计)

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 791人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号