SQL CASE 语句

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]
SQL Server CASE Statement 1

如何在 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
CASE Statement Subquery 2

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]
Searched CASE Statement 3

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 值。
  • 它按顺序执行其操作。这意味着当条件满足时,它将停止。