CASE 语句 Oracle PL/SQL 示例

⚡ 智能摘要

PL/SQL CASE 语句根据选择器从多个选项中选择一个,类似于 IF-THEN-ELSIF 语句,但更清晰易懂。简单的 CASE 语句匹配选择器的值,而搜索式 CASE 语句会评估每个 WHEN 子句中的条件,并执行第一个为真的选项。

  • 🔀 目的: CASE 使用选择器而不是布尔链,从多个操作块中选择一个。
  • 🎯 选择器: CASE 表达式会被计算一次,并与每个 WHEN 值进行比较。
  • 🔎 搜索案例: 在每个 WHEN 子句中添加完整的条件,并执行第一个为真的条件。
  • 🧮 任意类型: 选择器可以是变量、数字或算术表达式。
  • 🛟 别的: 当没有其他匹配项时,会运行可选的 ELSE 代码块。
  • 🔚 案例结束: 必须使用 END CASE 语句来结束语句。
  • 🗄️ SQL友好型: 与 IF 不同,CASE 也可以直接在 SQL 语句中使用。

CASE 语句 Oracle PL / SQL

什么是 CASE 陈述?

CASE 语句类似于 IF-THEN-ELSIF 语句;它根据条件从可用选项中选择一个备选方案。

  • CASE 语句使用“选择器”而不是布尔表达式来选择顺序。
  • CASE 语句中表达式的值被视为选择器。
  • 表达式可以是任何类型(算术表达式、变量表达式等)。
  • 每个备选方案都被赋予一个预定义的值(选择器),选择器值与条件表达式值匹配的备选方案将被执行。
  • 与IF-THEN-ELSIF不同,CASE语句也可以在SQL语句中使用。
  • CASE 语句中的 ELSE 块包含当所有选项均未被选中时要执行的序列。

句法

CASE (expression)
WHEN <value1> THEN action_block1;
WHEN <value2> THEN action_block2;
WHEN <value3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • 上述语法中,表达式返回的值可以是任何类型的。
  • 每个“WHEN”子句都是一个具有以下条件的备选方案:以及。
  • 选择值与表达式匹配的“WHEN”子句,并执行其已执行。
  • 'ELSE' 代码块是可选的,用于存放以下内容:当没有其他匹配项时执行。
  • 'END' 表示 CASE 语句的结束,是 CASE 语句的必要组成部分。

示例 1:使用 CASE 进行算术运算

在这个例子中,我们对两个数字 55 和 5 进行算术运算。

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'MULTIPLY';
BEGIN
dbms_output.put_line('Program started.');
CASE (arth_operation)
WHEN 'ADD' THEN dbms_output.put_line('Addition of the numbers are: '|| a+b );
WHEN 'SUBTRACT' THEN dbms_output.put_line('Subtraction of the numbers are: '||a-b );
WHEN 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are:'|| a/b);
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code 说明

  • Code 第 2 行:将变量“a”声明为“NUMBER”,并将其初始化为值“55”。
  • Code 第 3 行:将变量“b”声明为“NUMBER”,并将其初始化为值“5”。
  • Code 第 4 行:将变量“arth_operation”声明为大小为 20 的“VARCHAR2”类型,并将其初始化为值“MULTIPLY”。
  • Code 第 6 行:打印语句“程序已启动”。
  • Code 第 7 行:CASE 语句检查表达式的值。这里,'arth_operation' 的值为 'MULTIPLY',它被视为选择器。
  • Code 第 10 行:值为“MULTIPLY”的 WHEN 子句与选择器匹配,因此控制器选择此操作块并打印“数字的乘积为:275”。
  • Code 第 13 行:标志着 CASE 语句的结束。
  • Code 第 14 行:打印语句“程序完成”。

Code 输出

Program started.
Multiplication of the numbers are: 275
Program completed.

已搜查案件声明

被搜索的 CASE 语句与 CASE 语句类似,但被搜索的 CASE 语句不是使用选择器来选择备选方案,而是直接在 WHEN 子句中定义条件。

  • 第一个满足条件的 WHEN 子句将被执行,控制器将跳过其余选项。

句法

CASE
WHEN <expression1> THEN action_block1;
WHEN <expression2> THEN action_block2;
WHEN <expression3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • 在上述语法中,每个 WHEN 子句都有一个单独的和。
  • 执行表达式返回 TRUE 的 WHEN 子句。
  • 'ELSE' 代码块是可选的,用于存放以下内容:当所有其他替代方案均不满足时执行。
  • 'END' 表示 CASE 语句的结束,是 CASE 语句的必要组成部分。

示例 1:使用搜索 CASE 进行算术计算

在这个例子中,我们对两个数字 55 和 5 进行算术运算。

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'DIVIDE';
BEGIN
dbms_output.put_line('Program started.');
CASE
WHEN arth_operation = 'ADD'
THEN dbms_output.put_line('Addition of the numbers are: '||a+b );
WHEN arth_operation = 'SUBTRACT'
THEN dbms_output.put_line('Subtraction of the numbers are: '|| a-b);
WHEN arth_operation = 'MULTIPLY'
THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN arth_operation = 'DIVIDE'
THEN dbms_output.put_line('Division of the numbers are: '|| a/b );
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code 说明

  • Code 第 2 行:将变量“a”声明为“NUMBER”,并将其初始化为值“55”。
  • Code 第 3 行:将变量“b”声明为“NUMBER”,并将其初始化为值“5”。
  • Code 第 4 行:将变量“arth_operation”声明为大小为 20 的“VARCHAR2”类型,并将其初始化为值“DIVIDE”。
  • Code 第 6 行:打印语句“程序已启动”。
  • Code 第 7 行:搜索的 CASE 语句开始。ADD、SUB 子句。TRACT 和 MULTIPLY 被跳过,因为它们的条件与“arth_operation”的值不匹配。
  • Code 第 14 行:WHEN 子句表达式“arth_operation = 'DIVIDE'”得到满足,并返回 TRUE。
  • Code 第 15 行:执行 WHEN 子句的操作块,并打印“数字的除法结果为:11”。
  • Code 第 17 行:标志着 CASE 语句的结束。
  • Code 第 18 行:打印语句“程序完成”。

Code 输出

Program started.
Division of the numbers are: 11
Program completed.

案例与检索案例的比较

两种形式都选择一条分支,但它们在分支的选择方式上有所不同,如下所述。

类型 描述 用法
案例 类似于 IF-THEN-ELSIF 语句。“选择器”用于选择备选方案,而不是布尔表达式。 用于通过选择器从多个选项中进行选择。
搜查案件 这是一个没有实际选择器的 CASE 语句。它包含一个条件(该条件的计算结果为 TRUE 或 FALSE),用于选择备选方案。 用于从两个以上的选项中进行选择,通常有范围条件。

常见问题

简单的 CASE 语句会将一个选择器值与每个 WHEN 值进行比较。而搜索式 CASE 语句则没有选择器,它会在每个 WHEN 值中评估完整的条件,因此可以处理范围和复合测试。

是的。CASE 表达式可以出现在 SELECT、WHERE 或 ORDER BY 子句中,这是它相对于 IF-THEN-ELSIF 的一个关键优势,IF-THEN-ELSIF 结构只能在 PL/SQL 块内使用。

如果 CASE 语句中没有匹配的分支且没有 ELSE 子句,则会引发 CASE_NOT_FOUND 异常。添加 ELSE 子句(即使是空的 NULL 操作)可以避免此运行时错误。

是的。当分支将一个表达式与固定值进行比较时,AI 可以将链式语句重写为更简洁的 CASE 语句。请验证结果,因为缺少 ELSE 的 CASE 语句与缺少 ELSIF 的 CASE 语句的行为不同。

CASE 语句会根据每个分支执行一个操作块,并以 END CASE 结束。CASE 表达式返回单个值,并以 END 结束,因此可以将其赋值给变量或在 SQL 中使用。

总结一下这篇文章: