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。

  1. 简单案例
  2. 搜索案例

简单案例

简单案例的语法

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' 如下所示,有两列四行:

SQL Server 中的简单案例

我们将使用 '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 的执行流程。

SQL Server 中的简单案例

查询 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 的执行流程。

SQL Server 中的简单案例

搜索案例

搜索式案例的语法

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

结果: 下图 解释执行流程搜查案件 - 没有别的了。

SQL Server 中的搜索 CASE 示例

查询 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 搜查案件 - 别的。

在 SQL Server 中搜索 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

在这里, ‘教程名称’ 是 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 语句之前。

例如:
案件
当 Value_1 时则 Statement_1…

Case 关键字后面紧跟 WHEN 语句,且 CASE 与 WHEN 之间没有表达式。

例如:
案例然后 Statement_1…

在简单情况下,每个 WHEN 语句都存在 VALUE。这些值:Value_1、Value_2… 依次与单个 CASE_Expression 进行比较。结果将根据每个 WHEN 语句的 TRUE/FALSE 条件进行评估。

例如:
案件
当 Value_1 时则 Statement_1…
当 Value_2 时则 Statement_2…

在搜索案例中,每个 WHEN 语句都存在布尔表达式。此布尔表达式:布尔表达式 1、布尔表达式 2、… 评估每个 WHEN 语句的 TRUE/FALSE 条件。

例如:
CASE
什么时候然后 Statement_1…
什么时候然后 Statement_2…

Simple Case 仅支持相等性检查。即 CASE_Expression = VALUE_1, VALUE_2…

例如:
案件当 Value_1 时则 Statement_1…在上面的例子中,系统执行的唯一操作是检查 Case_Expression 是否 = Value_1

使用 Boolean_Expression_N,Search Case 支持任何产生布尔值的运算。它包括等于和不等于运算符。

例如:
案例THEN Statement_1…在上面的例子中,Boolean_Expression_1 可以包含“等于”和“不等于”运算符,如 A = B,A != B。

嵌套 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 美元之间,系统将打印“访问欧洲”

SQL Server 中的嵌套 CASE

嵌套 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 美元之间,系统将打印“访问欧洲”

SQL Server 中的嵌套 CASE 示例

更新案例

假设:假设我们有一张表“Guru99”,它有两列四行,如下所示:

SQL Server 中的 UPDATE 语句

我们将在后续示例中使用“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'

SQL Server 中的 UPDATE 语句

让我们查询 Guru99 表来检查更新的值:

SQL Server 中的 UPDATE 语句

带 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 被选择用于按条件排序

SQL Server 中使用 Order by 的 CASE

有趣的事实!

  • CASE 可以嵌套在另一个 CASE 中,也可以嵌套在另一个 IF…ELSE 语句中。
  • 除了 SELECT 之外,CASE 还可以与另一个一起使用 SQL 子句,如 UPDATE、ORDER BY。

结语

  • 在 MS SQL 中,有两种类型的 CASE:简单 CASE 和搜索 CASE
  • ELSE 在 CASE 语句中是可选的。