SQL Server 中的 CASE 语句和嵌套案例:T-SQL 示例

⚡ 智能摘要

CASE 是 SQL Server 中的一个条件表达式,它根据第一个计算结果为真的条件返回一个值,提供简单形式和搜索形式,并且可以嵌套在 IF…ELSE、UPDATE 和 ORDER BY 中。

  • 🧭 条件值: CASE 表达式返回的值取决于哪个 WHEN 条件首先被评估为真。
  • 1️⃣ 简单案例: 简单的 CASE 语句将一个表达式与一系列值进行比较,并对每个 WHEN 执行相等性检查。
  • 🔎 搜索案例: 搜索 CASE 会为每个 WHEN 评估一个单独的布尔表达式,支持范围和不等运算符。
  • ➖ ELSE 是可选的: 当没有 WHEN 匹配项且省略 ELSE 时,CASE 表达式返回 NULL。
  • 🪆 嵌套: CASE 语句可以嵌套在另一个 CASE 语句中,也可以嵌套在 IF…ELSE 语句中,以实现多级逻辑。
  • 🔧 超越 SELECT: 除了 SELECT 之外,CASE 还可以与 UPDATE 和 ORDER BY 子句配合使用,以实现条件更新和排序。

SQL Server 中的 CASE 语句和嵌套 CASE 语句及 T-SQL 示例

现实生活中的案例概述!

同样,在现实生活中,我们会根据不同情况的结果采取不同的行动。为了更详细地说明这一点,请看下面的例子:

  • 如果机票少于 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。

下图展示了一个简单案例的执行流程:

流程图展示了一个简单的 CASE 语句如何按顺序评估每个 WHEN 值。

例子

假设我们有一个名为“Guru99' 包含两列:Tutorial_ID 和 Tutorial_name,以及四行,如下所示。我们将使用此 'Guru以下示例中的 99' 表格。

样本 Guru包含 Tutorial_ID 和 Tutorial_name 列以及四行的 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 的执行流程。

一个简单的 CASE 语句(没有 ELSE 语句)的结果显示: Descript针对每个 Tutorial_name 的 ion

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

使用 ELSE 语句的简单 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。

下图展示了搜索案例的执行流程:

流程图展示了搜索 CASE 如何按顺序评估每个布尔表达式

例子

查询 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。

搜索结果为不包含 ELSE 语句的 CASE 语句,其中每个 Tutorial_name 都与一个 A 匹配。 Description

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

带有 ELSE 的 CASE 语句的搜索结果,返回非 SQL 语言的默认文本

执行方法之间的区别:简单方法和搜索方法

让我们来看下面的简单示例:

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 语句之前。

例如:
案件
当 Value_1 时则 Statement_1…

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

例如:
案例然后是语句_1…

在简单情况下,每个 WHEN 语句都有一个对应的值(Value_1、Value_2……)。这些值会依次与单个 CASE 表达式进行比较。比较结果会根据每个 WHEN 语句的 TRUE/FALSE 条件进行评估。

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

在搜索案例中,每个 WHEN 语句都对应一个布尔表达式。这些布尔表达式(Boolean_Expression_1、Boolean_Expression_2……)用于评估每个 WHEN 语句的 TRUE/FALSE 条件。

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

简单案例仅支持相等性检查,即 CASE_Expression 是否等于 VALUE_1、VALUE_2…

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

使用 Boolean_Expression_N,搜索案例支持任何能产生布尔值的操作。它包括等于和不等于运算符。

例如:
案例然后是语句_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 语句,如果 SQL Server 中的 CASE 条件为 False,则执行 ELSE 语句。ELSE 部分包含一个嵌套的 CASE 语句。根据机票价格,将显示以下结果之一:

  • 如果机票价格超过 400 美元,系统会打印“参观附近旅游景点”。
  • 如果机票价格在 0 美元到 100 美元之间,系统会打印“访问洛杉矶”。
  • 如果机票价格在 101 美元到 200 美元之间,系统会打印“访问纽约”。
  • 如果机票价格在 201 美元到 400 美元之间,系统会打印“游览欧洲”。

下面的结果显示了嵌套的 CASE 语句在 ELSE 分支中运行时返回的位置:

嵌套在 IF…ELSE 语句中的 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 语句。返回的地点与上一个例子遵循相同的票价范围,因此 250 美元的机票属于 201 美元到 400 美元的范围,并返回“Visit Europe”(游览欧洲)。

下面的结果显示了内部 CASE 返回的 250 美元车票的位置:

嵌套在另一个 CASE 中的 CASE 的结果为:购买 250 英镑的“访问欧洲”门票

更新案例

再次假设我们有“Guru如下所示,99 英尺长的表格有两列四行:

GuruCASE UPDATE 之前的 99 表,显示了原始的 Tutorial_Name 值

我们可以将 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'。

运行该语句会更新匹配的行,如下所示:

CASE UPDATE 语句的执行结果 Guru99桌

让我们查询“Guru99' 表格用于检查更新后的值:

GuruCASE UPDATE 后的 99 表显示了新的 Tutorial_Name 值

带 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 表达式对 ORDER BY 子句进行排序的结果 Guru按 T​​utorial_ID 列的第 99 个表

有趣的事实!

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

常见问题

IIF() 是 CASE 表达式的简写形式,它表示一个包含两个结果的表达式:当条件为真时返回一个值,当条件为假时返回另一个值。完整的 CASE 表达式更加灵活,可以在一条语句中测试多个 WHEN 条件。

是的。因为 CASE 函数会返回一个值,所以它可以出现在 SELECT 子句、WHERE 子句、HAVING 子句和 GROUP BY 子句中。在 WHERE 子句中,CASE 函数允许您根据其他列的值应用不同的筛选逻辑。

是的。在 SUM()、COUNT() 或 AVG`()` 执行条件聚合,仅对符合每个 WHEN 条件的行进行汇总或计数。此技术常用于构建透视表式汇总报表。

COALESCE 和 ISNULL 函数只能返回列表中第一个非空值。CASE 表达式的功能更广泛:它可以评估任意布尔条件或值匹配,并返回第一个为真的分支的结果。

CASE 表达式返回单一数据类型。SQL Server 根据每个 THEN 和 ELSE 结果的数据类型优先级来确定其返回类型,因此所有分支都应返回兼容的类型,以避免转换错误。

是的。CASE 表达式可以出现在视图的 SELECT 语句中,也可以出现在存储过程、函数或触发器中的任何位置。所有这些对象都使用相同的表达式语法。

是的。 GitHub 副驾驶 可以根据自然语言提示编写简单 CASE 表达式和搜索式 CASE 表达式,包括嵌套 CASE 和 UPDATE 语句中的 CASE。运行查询前,务必检查 WHEN 条件、分支顺序和 ELSE 语句的处理方式。

人工智能和机器学习助手可以将纯英文规则翻译成简单或搜索式的 CASE 表达式,建议缺失的 WHEN 分支,并标记重叠部分。ping 或者无法满足某些条件。开发人员会在部署前审核每条建议的正确性。

总结一下这篇文章: