SQL Server 中的 CASE 语句和嵌套案例:T-SQL 示例
现实生活中的案例概述!
同样,在现实生活中,我们根据不同条件的结果采取不同的行动。
为了进一步阐述,请考虑以下示例:
- 如果机票少于 100 美元,那么我将访问洛杉矶。
- 如果机票价格在 100 至 200 美元之间,那么我将前往纽约
- 如果机票价格在 200 至 400 美元之间,那么我将前往欧洲
- 否则,我更愿意去参观一些附近的旅游景点。
让我们考虑将条件和动作与下面的例子分开分类:
状况 - 机票 | 执行的操作,仅当条件为 TRUE |
Less 比$ 100 | 参观洛杉矶 |
之间$ 100 $ 200的 | 游览纽约 |
之间$ 200 $ 400的 | 参观欧洲 |
以上条件均不满足 | 附近的旅游景点 |
在上面的例子中,我们可以看到不同条件的结果控制着不同的行为。例如,只有在机票价格在 100 到 200 美元之间的情况下,访客才会执行访问纽约的行为。
类似地,MS SQL CASE 语句也提供了根据不同条件的结果执行不同 T-SQL 语句的功能。
SQL Server 中的 CASE 语句是什么?
SQL Server 中的 CASE 语句 是 IF…ELSE 语句的扩展。与 IF…ELSE 不同,后者只允许一个条件的最大值,而 CASE 允许用户在 MS SQL 中应用多个条件来执行不同的操作集。它会返回与用户定义的条件相关的相应值。
让我们在以下章节中学习如何在 SQL 中使用 Case 及其概念。
In 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]
在这里,
- 参数 案例表达式 表示我们最终将与之比较的表达式 值_1、值_2,...
- 参数 声明_1、声明_2…表示如果 Case_Expression 满足条件,则执行的语句 = 值_1,案例表达式 = Value_2,...等等。
- 简而言之, 流程条件 Case_Expression 是否 = Value_N 和 ACTION 是 Statement_N 的执行,如果 以上结果为 TRUE.
- 别名 是可选的,是赋予 SQL Server CASE 语句结果的别名。在 SQL Server select 子句中使用 Case 时最常用。
简单案例规则
- 简单案例仅允许对 Case_Expression 与 Value_1 至 Value_N 进行相等性检查。
- Case_Expression 与 Value 进行比较,从第一个值开始,即 Value_1。执行方式如下:
- 如果 Case_Expression 等同于 Value_1,则会跳过进一步的 WHEN…THEN 语句,并且 CASE 执行将立即结束。
- 如果 Case_Expression 与 Value_1 不匹配,则将 Case_Expression 与 Value_2 进行比较以确定是否相等。将 Case_Expression 与 Value 进行比较的过程将持续到 Case_Expression 从 Value_1、Value_2 等集合中找到匹配的等值。
- 如果没有匹配项,则控制权转到 ELSE 语句,并且 Statement_Else 将被执行。
- ELSE 是可选的。
- 如果 ELSE 不存在且 Case_Expression 与任何值都不匹配,则 将显示空值。
下图说明了简单案例的执行流程。
例子
假设: 假设我们有如下表格 'Guru99' 如下所示,有两列四行:
我们将使用 'Guru99' 进一步的例子中的表格
查询 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 的 SIMPLE CASE 的执行流程。
查询 2:带有 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.' 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 时将执行的语句。
- 简而言之,条件是布尔表达式 1,…,而动作是如果上述布尔表达式 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 条件。评估 Boolean_expression 的过程将持续到其中一个 Boolean_expression 返回 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
结果: 下图 解释执行流程 的 搜查案件 - 没有别的了。
查询 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
结果: 下图 解释执行流程 of 搜查案件 - 别的。
执行方法之间的区别:简单方法和搜索案例。
让我们来看看 简单案例 下面的例子:
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
在这里, ‘教程名称’ 是 SQL 中 CASE 表达式的一部分。然后 ‘教程名称’ 值与每个值进行比较 当值, 例如 'SQL'... 直到 'Tutorial_name' 与 WHEN 值匹配。
恰恰相反, 搜索案例 例子没有 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.
简单案例和搜索案例之间的区别
简单情况 | 搜查案例 |
---|---|
CASE 关键字紧跟在 CASE_Expression 之后,并在 WHEN 语句之前。
例如: |
Case 关键字后面紧跟 WHEN 语句,且 CASE 与 WHEN 之间没有表达式。
例如: |
在简单情况下,每个 WHEN 语句都存在 VALUE。这些值:Value_1、Value_2… 依次与单个 CASE_Expression 进行比较。结果将根据每个 WHEN 语句的 TRUE/FALSE 条件进行评估。
例如: |
在搜索案例中,每个 WHEN 语句都存在布尔表达式。此布尔表达式:布尔表达式 1、布尔表达式 2、… 评估每个 WHEN 语句的 TRUE/FALSE 条件。
例如: |
Simple Case 仅支持相等性检查。即 CASE_Expression = VALUE_1, VALUE_2…
例如: |
使用 Boolean_Expression_N,Search Case 支持任何产生布尔值的运算。它包括等于和不等于运算符。
例如: |
嵌套 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 语句,如果 Case 条件为 SQL服务器 为 False,则执行 ELSE 语句。
否则,其中包含 SQL 中的嵌套 CASE 语句。根据机票价值,将显示以下结果之一:
- 如果机票价格 > 400 美元,系统将打印“访问附近旅游景点”
- 如果机票价格在 0 至 100 美元之间,系统将打印“访问洛杉矶”
- 如果机票价格在 101 美元至 200 美元之间,系统将打印“访问纽约”
- 如果机票价格在 201 美元至 400 美元之间,系统将打印“访问欧洲”
嵌套 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。
根据机票价值,将显示以下结果之一:
- 如果机票价格 > 400 美元,系统将打印“访问附近旅游景点”
- 如果机票价格在 0 至 100 美元之间,系统将打印“访问洛杉矶”
- 如果机票价格在 101 美元至 200 美元之间,系统将打印“访问纽约”
- 如果机票价格在 201 美元至 400 美元之间,系统将打印“访问欧洲”
更新案例
假设:假设我们有一张表“Guru99”,它有两列四行,如下所示:
我们将在后续示例中使用“Guru99”表
我们可以将 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 被选择用于按条件排序
有趣的事实!
- CASE 可以嵌套在另一个 CASE 中,也可以嵌套在另一个 IF…ELSE 语句中。
- 除了 SELECT 之外,CASE 还可以与另一个一起使用 SQL 子句,如 UPDATE、ORDER BY。
结语
- 在 MS SQL 中,有两种类型的 CASE:简单 CASE 和搜索 CASE
- ELSE 在 CASE 语句中是可选的。