SQL Server 的 Case 语句类似于控制流语句(类似于 IF ELSE)。该语句会评估 WHEN 中提供的一系列条件表达式并返回结果集。
SQL Server Case 语句语法
Case 的语法如下所示。
CASE Input_Expression
WHEN test_expression THEN result_expression
.........
ELSE default_expression
END
-- Searched Syntax
WHEN Boolean_expression THEN result_expression
.........
ELSE default_expression
END
对于 SQL Server 搜索 case 表达式语法,Input_Expression 是可选的,所以我们可以删除它。参数是:
- Input_Expression:一个有效的您想检查的表达式。例如,它可以是您想操作的任何列。
- When Clause:用于测试多个表达式。
- test_expression:您必须指定一个表达式。查询会将该值或表达式与 Input_Expression 进行比较;如果为 TRUE,则返回 result_expression。
- result_expression:请为 case 语句提供一个表达式。如果 test_expression 等于 Input_Expression,则返回此表达式的值。如果它们不相等,则返回 default_expression。
- Boolean_expression:提供一个您想在搜索操作中使用的有效布尔表达式。
- 可选的 else 语句有助于显示默认消息。
对于此 Case 语句演示,我们使用 EmployeeTb。

SQL Case 语句的类型
Case 语句有两种类型,它们是:
简单 Case 语句
简单 case 表达式将 input_expression 与一系列 test_expressions 进行比较,后面跟着 WHEN 关键字。一旦找到匹配项,简单 CASE 语句将返回相应的 result_expression,后面跟着 THEN 关键字。如果没有匹配项,它将返回默认表达式。
简单 Case 语句示例
让我们在 SQL Server 中编写一个简单的 case 语句。以下查询将检查 MyEmployees 表中的每一行是否满足条件。
- Occupation = Management,如果为 TRUE,则将 Administrator 分配给 Department Name。
- Occupation = Professional,如果为 TRUE,则将 Sr. Software Developer 分配给 Department Name。
- Occupation = Skilled manual;如果为 TRUE,则将 Software Developer 分配给 Department Name。
- Else 子句 – 如果以上所有条件都失败,则 Server 将 Fresher 分配给 Department Name。
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,CASE[Occupation]
WHEN 'Management' THEN 'Administrators'
WHEN 'Professional' THEN 'Sr. Software Developer'
WHEN 'Skilled Manual' THEN 'Software Developer'
ELSE 'Freshers'
END AS [Department Name]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [EmployeeTb]

如何在 case 中使用子查询?
以下查询示例在 SQL Server 的 Case 语句中使用了子查询。首先,子查询将执行并查找 Sales 金额的平均值。然后,它将检查 Sales 是否大于平均 Sales (1970.9055)。
如果为 TRUE,则将“This Employee is Performing Good”分配给 Remarks 列。否则,它将分配“He is Under Performing”(else 子句)。这与 IF ELSE 条件相同。
-- In Subquery or nested query
SELECT [EmpID]
,[FirstName] + ' ' + [LastName] AS FullName
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,CASE
WHEN (SELECT AVG([Sales]) FROM [EmployeeTb])
<= emp.[Sales] THEN 'This Employee is Performing Good'
ELSE 'He is Under Performing'
END AS Remarks
FROM [EmployeeTb] AS emp

SQL 搜索 Case 语句
这对于执行更强大、更复杂的比较非常有用。它包含一系列布尔表达式,后面跟着 WHEN 关键字,并将评估其中的条件。
- 如果条件为 TRUE,则返回 result_expression,后面跟着 THEN 关键字。
- 如果没有匹配项,它将返回 ELSE 子句块中提供的默认表达式。
搜索 Case 语句示例
我将编写一个带有多个值的搜索 Case 语句。
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[Position] =
CASE
WHEN [Sales] < 100 THEN 'Terminate'
WHEN [Sales] >= 100 AND [Sales] <= 600 THEN 'Last Warning'
WHEN [Sales] > 600 AND [Sales] < 2000 THEN 'Good Job'
WHEN [Sales] >= 2000 AND [Sales] < 4500 THEN 'Great Job - Increase Sales Commission by 1%'
ELSE 'Promote as Regional Manager'
END
FROM EmployeeTb]

SQL Case 语句更新表记录
如何使用 case 语句使用新值更新 [MyEmployes Table] 中的记录?
OUTPUT 子句返回我们在表中插入、删除和更新的数据的副本。这里,我们使用 OUTPUT 子句在一处显示旧的年收入值和更新的收入值。
-- To Update records
UPDATE [EmployeeTb]
SET [YearlyIncome] = (
CASE
WHEN [Sales] < 100 THEN [YearlyIncome] - 10000
WHEN [Sales] >= 100 AND [Sales] <= 600 THEN [YearlyIncome] - 5000
WHEN [Sales] > 600 AND [Sales] < 2000 THEN [YearlyIncome] + 5000
WHEN [Sales] >= 2000 AND [Sales] < 4500 THEN [YearlyIncome] + 25000
ELSE [YearlyIncome] + 55000
END
)
OUTPUT inserted.[YearlyIncome] AS [New Income],
deleted.[YearlyIncome] AS [Old Income];

让我们看看上面 Case 语句示例的输出。

Case 的局限性
- 我们不能用它来控制查询的执行流程、用户定义函数和存储过程。
- 允许最多 10 个嵌套表达式级别。
- 不能使用简单 case 语句检查 NULL 值。
- 它按顺序执行其操作。这意味着当条件满足时,它将停止。