SQL CASE

2025年2月2日 | 5 分钟阅读

CASE 语句是一种操作 if-then-else 类型逻辑查询的语句。当指定的条件求值为 True 时,此语句将返回值。当没有条件求值为 True 时,它将返回 ELSE 部分的值。

当没有 ELSE 部分且没有条件求值为 True 时,它将返回 NULL 值。

在结构化查询语言中,CASE 语句用于 SELECT、INSERT 和 DELETE 语句,包含以下三个子句:

  1. WHERE 子句
  2. ORDER BY 子句
  3. GROUP BY 子句

SQL 中的此语句始终后跟至少一对 WHEN 和 THEN 语句,并始终以 END 关键字结束。

关系数据库中的 CASE 语句有两种类型:

  1. 简单 CASE 语句
  2. 搜索式 CASE 语句

SQL 中 CASE 语句的语法

在此,CASE 语句逐个评估每个条件。

如果表达式与第一个 WHEN 子句的条件匹配,它将跳过所有后续的 WHEN 和 THEN 条件,并在结果中返回 statement_1。

如果表达式与第一个 WHEN 条件不匹配,它将与第二个 WHEN 条件进行比较。此匹配过程将一直持续到表达式与任何 WHEN 条件匹配为止。

如果没有条件与表达式匹配,控制将自动转到 ELSE 部分并返回其结果。在 CASE 语法中,ELSE 部分是可选的。

在语法中,CASE 和 END 是最重要的关键字,它们表示 CASE 语句的开始和结束。

SQL 中 CASE 语句的示例

让我们来看 Student_Details 表,它包含学生的 roll_no、name、marks、subject 和 city。

Roll_No学生姓名 (Stu_Name)Stu_Subject学生分数 (Stu_Marks)Stu_City
2001Akshay科学92Noida
2002Ram数学49斋浦尔
2004Shyam英文52Gurgaon
2005Yatin印地语45勒克瑙
2006马诺吉电脑70Ghaziabad
2007Sheetal数学82Noida
2008Parul科学62Gurgaon
2009Yogesh英文42勒克瑙
2010Ram电脑88德里
2011Shyam印地语35Kanpur

示例 1:以下 SQL 语句将单个 WHEN 和 THEN 条件用于 CASE 语句。

上述查询的解释

在此,CASE 语句检查 **Stu_Marks** 是否大于等于 50,如果是,则在 **Student_Result** 列中返回 **Student_Passed**,否则将移动到 **ELSE** 部分并返回 **Student_Failed**。

输出

Roll_No学生姓名 (Stu_Name)Stu_Subject学生分数 (Stu_Marks)Student_Result
2001Akshay科学92Student_Passed
2002Ram数学49Student_Failed
2004Shyam英文52Student_Passed
2005Yatin印地语45Student_Failed
2006马诺吉电脑70Student_Passed
2007Sheetal数学82Student_Passed
2008Parul科学62Student_Passed
2009Yogesh英文42Student_Failed
2010Ram电脑88Student_Passed
2011Shyam印地语35Student_Failed

示例 2:以下 SQL 语句向 CASE 语句添加了多个 WHEN 和 THEN 条件。

上述查询的解释

在此,CASE 语句逐个检查多个 WHEN 和 THEN 条件。如果 **Stu_Marks** 列的值大于等于 **90**,则返回 **Outstanding**,否则将继续检查后续的 WHEN 和 THEN 条件。

如果 **Student_Details** 表中没有任何条件匹配,CASE 将在 **Stu_Remarks** 列中返回 **NULL** 值,因为查询中没有 ELSE 部分。

输出

Roll_No学生姓名 (Stu_Name)Stu_Subject学生分数 (Stu_Marks)Stu_Remarks
2001Akshay科学92Outstanding
2002Ram数学49Failed
2004Shyam英文52
2005Yatin印地语45Failed
2006马诺吉电脑70
2007Sheetal数学82优秀
2008Parul科学62平均数
2009Yogesh英文42Failed
2010Ram电脑88优秀
2011Shyam印地语35Failed

示例 3

让我们来看另一个 Employee_Details 表,它包含 Emp_ID、Emp_Name、Emp_Dept 和 Emp_Salary。

员工 IDEmp_NameEmp_DeptEmp_Salary
1Akshay融资9000
2Ram营销4000
3Shyam销售5000
4Yatin编码4000
5马诺吉营销5000
1Akshay融资8000
2Ram编码6000
3Shyam编码4000
4Yatin营销8000
5马诺吉融资3000

以下 SQL 查询使用 GROUP BY 子句和 CASE 语句。

输出

员工 IDEmp_NameEmp_DeptTotal_SalaryEmp_Remarks
1Akshay融资17000递增
2Ram营销9000递减
3Shyam销售10000递增
4Yatin编码12000递增
5马诺吉营销8000递减

示例 4:在此示例中,我们在 SQL 中使用 ORDER BY 子句和 CASE 语句。

让我们来看另一个 Employee_Details 表,它包含 Emp_ID、Emp_Name、Emp_Dept 和 Emp_Age。

我们可以使用以下 SQL 查询来检查 Employee_Details 的数据。

输出

员工 IDEmp_NameEmp_DeptEmp_Age
1Akshay融资23
2Ram营销24
3巴尔拉姆 (Balram)销售25
4Yatin编码22
5马诺吉营销23
6Sheetal融资24
7Parul融资22
8Yogesh编码25
9Naveen营销22
10Tarun融资23

以下 SQL 查询按员工姓名升序显示所有员工的详细信息。

输出

员工 IDEmp_NameEmp_DeptEmp_Age
1Akshay融资23
3巴尔拉姆 (Balram)销售25
5马诺吉营销23
9Naveen营销22
7Parul融资22
2Ram营销24
6Sheetal融资24
10Tarun融资23
4Yatin编码22
8Yogesh编码25

如果您想将在 Coding Department 工作的员工排在前面,那么对于此操作,您需要使用 CASE 语句中的单个 WHEN 和 THEN 语句,如以下查询所示。

输出

员工 IDEmp_NameEmp_DeptEmp_Age
4Yatin编码22
8Yogesh编码25
1Akshay融资23
3巴尔拉姆 (Balram)销售25
5马诺吉营销23
9Naveen营销22
7Parul融资22
2Ram营销24
6Sheetal融资24
10Tarun融资23

下一个主题SQL Inner Join