SQL Server CASE

17 Mar 2025 | 6 分钟阅读

CASE 表达式是控制流函数的一部分,它评估一系列条件并在第一个条件满足时给出输出。它主要用于处理条件语句,与其它编程语言中的 IF-THEN-ELSE 语句相同。CASE 语句评估条件,当发现为真时,它将停止执行并返回结果。如果未发现任何条件为真,它将评估 ELSE 部分以返回值并结束。当未找到 ELSE 块且未满足任何条件时,它将给出 NULL 值。

CASE 表达式可以在使用有效程序或查询的任何地方使用,例如 SELECT、WHERE 和 ORDER BY 子句。它的主要功能是管理 SELECT 子句中的多个 IF 语句。在 MS SQL Server 中,CASE 语句允许用户添加多个条件以执行各种操作集。

CASE 语句的类型

MS SQL Server 中有两种形式的 CASE 语句

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

简单 CASE

我们使用简单 CASE 语句进行相等性测试。它通过将表达式与一组多个值进行比较来确定结果。换句话说,此语句逐个评估条件,并在条件和表达式匹配时返回 THEN 子句中指定的表达式。

以下是简单 CASE 语句的语法

这里 CASE 语句通过将表达式(input_expression)与每个 WHEN 子句中定义的值进行比较来检查相等性。如果 input_expression 匹配 WHEN 子句的值,它将给出相应 THEN 子句中的结果语句。如果 input_expression 不匹配任何值且 ELSE 块可用,则 CASE 表达式将返回 ELSE 块的结果。当未找到 ELSE 部分且 input_expression 不匹配 WHEN 子句中的任何值时,CASE 表达式将给出 NULL 值。

示例

以下语句解释了 CASE 语句的简单示例

它将显示以下输出

SQL Server CASE

让我们解释 CASE 语句在表上的工作原理。以下语句创建一个名为 Tutorials 的表:

接下来,我们将使用以下语句向此表中添加一些记录

我们可以使用 SELECT 语句验证表,该语句显示以下数据

SQL Server CASE

以下 SQL CASE 语句评估每个条件并在第一个条件满足时返回值

它将给出以下输出,其中我们可以看到根据 CASE 语句中指定的条件得出的结果

SQL Server CASE

搜索 CASE 语句

搜索 CASE 语句是一种更全面的表达式评估格式,它评估一组布尔表达式以找到结果。它允许我们在每个布尔表达式中使用比较运算符和逻辑运算符。

以下是简单 CASE 语句的语法

此语句首先按照 CASE 表达式中定义的顺序评估每个 WHEN 子句的 boolean_expression。如果每个 WHEN 子句中的 boolean_expression 评估为 true,则此语句给出相应 THEN 子句的结果。如果评估为 false,则此语句返回 ELSE 块中指定的结果。如果未找到 ELSE 块且 boolean_expression 评估为 true,则 CASE 表达式将返回 NULLEND 子句是可选的。

示例

让我们解释 CASE 语句在表上的工作原理。假设我们有一个名为 student 的表,其中包含以下数据

SQL Server CASE

以下 SQL CASE 语句评估每个条件并在第一个条件满足时返回值

在上面的示例中,我们可以看到首先 'age' 是 CASE 表达式的一部分。之后,'age' 的值与每个 WHEN 语句进行比较,直到 'age' 与 WHEN 值匹配。这里,每个 WHEN 语句都有自己的条件布尔表达式。直到第一个布尔表达式评估为 TRUE,每个布尔表达式都评估为 TRUE/FALSE。

执行后,它将给出以下输出,其中我们可以看到根据 CASE 语句中指定的条件得出的结果

SQL Server CASE

嵌套 CASE 语句

我们还可以使用嵌套 CASE 语句。以下示例说明了嵌套 CASE 语句

我们将获得以下输出

SQL Server CASE

在上面的示例中,我们首先检查第一个 WHEN 条件 (salary > 25000) 是否为真。如果为 TRUE,我们将进入另一个 WHEN 条件 (salary > 35000)。如果第二个条件变为 TRUE,则学生被分配 '总经理' 的头衔,否则仅为 '经理'。最后,如果没有条件匹配,则学生被指定为 '助理经理'

CASE 语句与 ORDER BY 子句

我们还可以将 CASE 语句与 ORDER BY 子句一起使用,ORDER BY 子句用于以升序或降序排序结果。以下示例更清楚地解释了这一点

  • 对于年龄大于 17 岁的学生,学生的工资应以降序排列。
  • 对于年龄小于 17 岁的学生,学生的工资应以升序排列。

此条件可以通过结合使用 ORDER BY 和 CASE 语句来定义。在下面的语句中,我们结合了 ORDER BY 和 CASE 语句,并在 CASE 表达式中描述了排序条件

执行语句后,我们将得到以下输出

SQL Server CASE

带 CASE 语句的 UPDATE 语句

SQL Server 还允许我们将 CASE 语句与 UPDATE 语句一起使用。假设我们想根据 CASE 语句条件更新学生的年龄。我们可以通过以下条件来实现这一点

  • 如果学生年龄为 22 岁,则更新为 33 岁
  • 如果学生年龄为 17 岁,则更新为 18 岁

我们将在上面的 STUDENT 表中解释此示例。我们可以通过执行以下使用 CASE 语句的更新命令来满足我们的要求

我们将根据我们的要求获得结果

SQL Server CASE

返回值

CASE 表达式根据其使用的上下文返回结果。例如:

  • 如果它在字符串上下文中使用,它将返回字符串结果。
  • 如果它在数字上下文中使用,它将返回整数、浮点数、小数位值。

简单 CASE 和搜索 CASE 语句之间的区别

以下比较图解释了简单 CASE 和搜索 CASE 语句之间的主要区别

简单 CASE搜索 CASE
CASE 关键字和 WHEN 子句之间有一个表达式。例如,
CASE
WHEN Condition1 THEN Statement1 CASE 关键字和 WHEN 子句之间没有表达式。例如,
CASE WHEN Condition1 THEN Statement1
此语句用于简单的相等性检查,并通过将表达式与一组多个值进行比较来确定结果。此语句分别测试每个“when”语句的条件。它帮助我们解决比简单 CASE 更复杂的条件。
简单 CASE 语句仅支持相等性测试。搜索 CASE 语句支持任何使用 Boolean_Expression 返回布尔值的操作。它包括等于和不等于运算符。

CASE 语句的限制

以下是 CASE 语句的限制

  • CASE 语句不允许我们控制 SQL Server 中存储过程和函数的执行流。
  • CASE 语句可以在一个 Case 语句中有多个条件,但它只以顺序模型操作。当其中一个条件变为真时,它会停止测试后续语句。
  • CASE 语句不允许我们在表中包含 NULL 值。

下一个主题SQL Server JOIN