SQL Server 中的 CASE 语句和嵌套案例:T-SQL 示例
⚡ 智能摘要
CASE 是 SQL Server 中的一个条件表达式,它根据第一个计算结果为真的条件返回一个值,提供简单形式和搜索形式,并且可以嵌套在 IF…ELSE、UPDATE 和 ORDER BY 中。

现实生活中的案例概述!
同样,在现实生活中,我们会根据不同情况的结果采取不同的行动。为了更详细地说明这一点,请看下面的例子:
- 如果机票少于 100 美元,那么我将访问洛杉矶。
- 如果机票价格在 100 美元到 200 美元之间,那么我会去纽约。
- 如果机票价格在 200 美元到 400 美元之间,那么我就去欧洲。
- 否则,我更愿意去附近的旅游景点。
让我们以上述例子为例,分别对条件和行为进行分类:
| 机票条款 – 机票 | 仅当条件为真时才执行操作 |
| Less 比$ 100 | 参观洛杉矶 |
| 之间$ 100 $ 200的 | 游览纽约 |
| 之间$ 200 $ 400的 | 参观欧洲 |
| 以上条件均不满足 | 附近的旅游景点 |
在上面的例子中,我们可以看到不同条件的结果决定了不同的行为。例如,只有当机票价格在 100 美元到 200 美元之间时,游客才会去纽约。同样地, MS SQL CASE 语句还提供了根据不同条件的结果执行不同 T-SQL 语句的功能。
SQL Server 中的 CASE 语句是什么?
CASE 语句 SQL服务器 是……的延伸 如果别的 与最多只能设置一个条件的 IF…ELSE 语句不同,CASE 语句允许用户应用多个条件,从而在 MS SQL 中执行不同的操作集。它会返回与用户定义的条件相对应的值。
让我们学习如何在 CASE 中使用 SQL 以及以下章节中对其概念的阐述。在 MS SQL 中,CASE 语句有两种类型:
- 简单案例
- 搜索案例
简单案例
简单情况的语法
CASE <Case_Expression> WHEN Value_1 THEN Statement_1 WHEN Value_2 THEN Statement_2 . . WHEN Value_N THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
这里:
- 参数 Case_Expression 表示最终将与 Value_1、Value_2 等进行比较的表达式。
- 参数 Statement_1、Statement_2… 表示当 Case_Expression = Value_1、Case_Expression = Value_2 等时将执行的语句。
- 简而言之,条件是 Case_Expression 是否等于 Value_N,如果上述结果为 TRUE,则执行 Statement_N。
- ALIAS_NAME 是可选参数,用于指定 SQL Server CASE 语句结果的别名。它主要用于在 SQL Server SELECT 子句中使用 CASE 语句时。
简单案例规则
- 简单情况仅允许对 Case_Expression 的值(从 Value_1 到 Value_N)进行相等性检查。
- Case_Expression 将按顺序与一个值进行比较,从第一个值(即 Value_1)开始。以下是执行过程:
- 如果 Case_Expression 等同于 Value_1,则会跳过进一步的 WHEN…THEN 语句,并且 CASE 执行将立即结束。
- 如果 Case_Expression 与 Value_1 不匹配,则将 Case_Expression 与 Value_2 进行比较以判断其是否相等。此比较过程将持续进行,直到 Case_Expression 在 Value_1、Value_2 等集合中找到匹配的等效值为止。
- 如果没有匹配项,则控制权转移到 ELSE 语句,并执行 Statement_Else。
- ELSE 是可选的。
- 如果 ELSE 不存在且 Case_Expression 与任何值都不匹配,则显示 NULL。
下图展示了一个简单案例的执行流程:
例子
假设我们有一个名为“Guru99' 包含两列:Tutorial_ID 和 Tutorial_name,以及四行,如下所示。我们将使用此 'Guru以下示例中的 99' 表格。
查询 1:带有 NO ELSE 选项的 SIMPLE CASE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
结果:下图解释了没有 ELSE 的简单 CASE 的执行流程。
查询 2:带有 ELSE 选项的简单 CASE 语句
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
结果:下图解释了带有 ELSE 的 SIMPLE CASE 的执行流程。
搜索案例
搜索案例的语法
CASE WHEN <Boolean_Expression_1> THEN Statement_1 WHEN <Boolean_Expression_2> THEN Statement_2 . . WHEN <Boolean_Expression_N> THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
这里:
- 参数 Boolean_Expression_1… 表示将要评估为 TRUE 或 FALSE 的表达式。
- 参数 Statement_1、Statement_2… 表示当相应的 Boolean_Expression_1、Boolean_Expression_2 的结果为 TRUE 时将执行的语句。
- 简而言之,条件是 Boolean_Expression_1…,如果上述 Boolean_Expression_1 为 TRUE,则执行 Statement_N。
- ALIAS_NAME 是可选参数,用于指定 CASE 语句结果的别名。它主要用于在 SELECT 子句中使用 CASE 语句时。
案件检索规则
- 与简单情况不同,搜索情况不仅限于相等性检查,还允许使用布尔表达式。
- 布尔表达式按顺序求值,从第一个布尔表达式(即 Boolean_Expression_1)开始。以下是执行流程:
- 如果 Boolean_Expression_1 为 TRUE,则跳过后续的 WHEN…THEN 语句,CASE 执行将立即结束。
- 如果 Boolean_Expression_1 为 FALSE,则评估 Boolean_Expression_2 是否为 TRUE。此评估过程将持续进行,直到其中一个布尔表达式返回 TRUE 为止。
- 如果没有匹配项,则控制权转移到 ELSE 语句,并执行 Statement_Else。
- 与简单情况一样,搜索情况中的 ELSE 也是可选的。
- 如果 ELSE 不存在,且所有布尔表达式均未返回 TRUE,则显示 NULL。
下图展示了搜索案例的执行流程:
例子
查询 1:带有 NO ELSE 选项的 SEARCHED CASE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
结果:下图解释了 SEARCHED CASE 的执行流程,其中 NO ELSE。
查询 2:使用 ELSE 选项搜索案例
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
结果:下图解释了带有 ELSE 的 SEARCHED CASE 的执行流程。
执行方法之间的区别:简单方法和搜索方法
让我们来看下面的简单示例:
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
这里,“Tutorial_name”是SQL中CASE表达式的一部分。然后,“Tutorial_name”的值会与每个WHEN值(即“SQL”)进行比较……直到“Tutorial_name”与某个WHEN值匹配为止。
相反,SEARCH CASE 示例中没有 CASE 表达式:
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
这里,每个 WHEN 语句都有自己的条件布尔表达式。每个布尔表达式(例如,Tutorial_name = 'SQL'…)都会被评估为 TRUE/FALSE,直到遇到第一个评估结果为 TRUE 的布尔表达式为止。
简单案例和搜索案例的区别
| 简单情况 | 搜查案例 |
| CASE 关键字后面紧跟 CASE_Expression,并且位于 WHEN 语句之前。
例如: |
CASE 关键字后面紧跟 WHEN 语句,CASE 和 WHEN 之间没有表达式。
例如: |
| 在简单情况下,每个 WHEN 语句都有一个对应的值(Value_1、Value_2……)。这些值会依次与单个 CASE 表达式进行比较。比较结果会根据每个 WHEN 语句的 TRUE/FALSE 条件进行评估。
例如: |
在搜索案例中,每个 WHEN 语句都对应一个布尔表达式。这些布尔表达式(Boolean_Expression_1、Boolean_Expression_2……)用于评估每个 WHEN 语句的 TRUE/FALSE 条件。
例如: |
| 简单案例仅支持相等性检查,即 CASE_Expression 是否等于 VALUE_1、VALUE_2…
例如: |
使用 Boolean_Expression_N,搜索案例支持任何能产生布尔值的操作。它包括等于和不等于运算符。
例如: |
嵌套 CASE:IF ELSE 中的 CASE
我们可以在 IF…ELSE 语句中使用 CASE 语句。我们声明一个 变量 查找机票并根据其值进行分支。以下是示例 MS-SQL 代码:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 190; IF @Flight_Ticket > 400 PRINT 'Visit Nearby Tourist Location'; ELSE BEGIN SELECT CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END AS Location END
在上面的示例中,CASE 语句嵌套在 IF…ELSE 语句中。首先执行 IF 语句,如果 SQL Server 中的 CASE 条件为 False,则执行 ELSE 语句。ELSE 部分包含一个嵌套的 CASE 语句。根据机票价格,将显示以下结果之一:
- 如果机票价格超过 400 美元,系统会打印“参观附近旅游景点”。
- 如果机票价格在 0 美元到 100 美元之间,系统会打印“访问洛杉矶”。
- 如果机票价格在 101 美元到 200 美元之间,系统会打印“访问纽约”。
- 如果机票价格在 201 美元到 400 美元之间,系统会打印“游览欧洲”。
下面的结果显示了嵌套的 CASE 语句在 ELSE 分支中运行时返回的位置:
嵌套 CASE:CASE 位于 CASE 内部
在 SQL 中,我们可以将 CASE 语句嵌套在另一个 CASE 语句中。以下是 MS-SQL 代码示例:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 250; SELECT CASE WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.' WHEN @Flight_Ticket < 400 THEN CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END END AS Location
在上面的例子中,CASE 语句嵌套在另一个 CASE 语句中。系统首先执行外层 CASE 语句;如果 Flight_Ticket < $400,则执行内层 CASE 语句。返回的地点与上一个例子遵循相同的票价范围,因此 250 美元的机票属于 201 美元到 400 美元的范围,并返回“Visit Europe”(游览欧洲)。
下面的结果显示了内部 CASE 返回的 250 美元车票的位置:
更新案例
再次假设我们有“Guru如下所示,99 英尺长的表格有两列四行:
我们可以将 CASE 与 UPDATE 一起使用。以下是示例 MS-SQL 代码:
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
在上面的示例中,UPDATE 语句中使用了 CASE 语句。根据 Tutorial_Name 的值,Tutorial_Name 列会根据 THEN 语句的值进行更新:
- 如果 Tutorial_Name = 'SQL',则将 Tutorial_Name 更新为 '结构化查询语言'。
- 如果 Tutorial_Name = 'PL/SQL',则将 Tutorial_Name 更新为 'Oracle PL/SQL'。
- 如果 Tutorial_Name = 'MSSQL',则将 Tutorial_Name 更新为 'Microsoft SQL'。
- 如果 Tutorial_Name = 'Hadoop',则将 Tutorial_Name 更新为 'Apache Hadoop'。
运行该语句会更新匹配的行,如下所示:
让我们查询“Guru99' 表格用于检查更新后的值:
带 Order by 的 CASE
我们可以将 CASE 语句与 ORDER BY 语句结合使用。以下是 MS-SQL 代码示例:
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
这里使用了 CASE 语句和 ORDER BY 子句。@Order 设置为 1,并且由于第一个 WHEN 布尔表达式的计算结果为 TRUE,因此选择 Tutorial_ID 作为 ORDER BY 条件。结果如下所示:
有趣的事实!
- CASE 语句可以嵌套在另一个 CASE 语句中,也可以嵌套在 IF…ELSE 语句中。
- 除了 SELECT 之外,CASE 还可以与其他 SQL 子句一起使用,例如 UPDATE 和 ORDER BY。













