CASE

当需要根据 SPL 变量或单一表达式的值从许多分支中取用一个时,使用 CASE 语句。CASE 语句是对 IF 语句的快速替换。

语法

ELSE 子句

元素 描述 限制 语法
constant_expr 指定精确值的表达式 必须是精确数值、引用字符串、精确日期时间或精确时间间隔。数据类型必须与数据 value_expr 相一致 常量表达式
value_expr 返回值的表达式 SPL 变量或者返回值或 NULL 的其它类型的表达式。该数据类型不能是大对象(BLOB 、BYTE 、CLOB 、TEXT)、集合或者用户定义的 OPAQUE 或 DISTINCT 类型。在内置 OPAQUE 类型中,只有 BOOLEAN 和 LVARCHAR 是有效的。 表达式

用法

可以使用 CASE 语句在 SPL 例程中创建一组条件分支。WHEN 和 ELSE 子句都是可选的,但您必须提供其中一个或另一个。如果既不指定 WHEN 子句也不指定 ELSE 子句。则会收到语法错误消息。
  • 如果不包含 WHEN 子句也不包含 ELSE 子句,则 CASE 语句由于语法错误而失败。
  • 如果不包含 ELSE 子句,但是 WHEN 子句没有指定一个与 value_expr 相匹配的 constant expr t,则 CASE 语句在例程执行时产生错误 -26062 并失败。

不要将 CASE 语句和 SQL 的 CASE 表达式混淆。(CASE 表达式支持作为 CASE 语句的同一关键字。但是使用不同的语法和语义计算指定的 conditions 。CASE 表达式会返回一个值或 NULL,如 CASE 表达式 中描述。)

数据库服务器如何执行 CASE 语句

数据库服务器按一下操作的顺序的执行 CASE 语句:
  • 数据库服务器计算 value_expr 表达式。
  • 如果得到的值与在 WHEN 子句的 constant_expr 参数中指定的精确值相匹配,则数据库服务器执行跟随该 WHEN 子句中的 THEN 关键字的语句块。
  • 如果计算 value_expr 参数得到的值与多个 WHEN 子句中的 constant_expr 参数相匹配,则数据库服务器执行跟随 CASE 语句中第一个匹配的 WHEN 子句中 THEN 关键字的语句块。(在这种情况中,WHEN 子句的词法顺序可以确定 CASE 语句的结果。)如果数据库服务器执行了跟随在 THEN 关键字之后的 GOTO 语句,则数据库服务器将程序控制传递给指定的语句标签。否则,数据库服务器执行 SPL 例程中标识当前 CASE 语句结束的 END CASE 关键字后面的下一个 SPL 语句或 SQL 语句。
  • 如果 value_expr 参数计算的值与任何 WHEN 子句的 constant_expr 参数中指定的精确值不匹配,并且如果 CASE 语句包含 ELSE 子句,则数据库服务器执行跟随在 ELSE 关键字的语句块。如果数据库服务器执行了跟随在 ELSE 关键字之后的 GOTO 语句,则数据库服务器将程序控制传递给指定的语句标签。否则,数据库服务器执行 SPL 例程中标识当前 CASE 语句结束的 END CASE 关键字后面的下一个 SPL 语句或 SQL 语句。
  • 如果 value_expr 参数计算的值与任何 WHEN 子句的 constant_expr 参数中指定的精确值不匹配,并且如果 CASE 语句不包含 ELSE 子句,则数据库服务器发出异常,并且 CASE 语句失败,错误 -26062。SPL 例程是否终止或继续执行取决于其异常处理逻辑。

CASE 语句的此实现非常类似于GBase 8s Parallel Server 的实现,除了当未指定 ELSE 子句且没有 WHEN 子句与 value_expr 参数相匹配时,GBase 8s Parallel Server 不会发生错误。在这种情况下,程序执行将在紧跟 CASE 语句之后的 SPL 或 SQL 语句中继续。

更随 THEN 或 ELSE 关键字的语句块可以包括在 SPL 例程的语句块中有效的任何 SQL 语句或 SPL 语句。有关更多信息,请参阅语句块

在 CASE 语句中值表达式的计算

数据库服务器仅计算一次 value_expr 参数的值。它在开始执行 CASE 语句时计算此值。如果该参数中的指定表达式包含一个或多个 SPL 变量。并且这些变量中的任何变量的值随后在 CASE 语句中的一个语句块中修改,则数据库服务器不会重新计算 value_expr 参数的值。因此,在 value_expr 参数中指定的变量值的任何更改都不好影响 CASE 语句采用的分支。

CASE 语句的示例

在以下示例中,CASE 语句根据另一个命名为 i 的 SPL 变量的值将 SPL 变量集合(命名为 jklm)之一初始化为命名为 x 的 SPL 变量的值:

CASE i
        WHEN 1 THEN LET j = x;
        WHEN 2 THEN LET k = x;
        WHEN 3 THEN LET l = x;
        WHEN 4 THEN LET m = x;
        ELSE
        RAISE EXCEPTION 100; --invalid value
        END CASE;

此处每个 WHEN 子句指定一个整数作为它的常量表达式,假设值表达式具有数据类型。(如果这些精确值已用引号分隔,则数据库服务器将它们视为字符值。)

下面的示例包含 WHEN 子句中对 NULL 的测试,其表达式的值和常量表达式的数据类型为 CHAR(1):

CREATE PROCEDURE case_proc( ) 
        RETURNING CHAR(1);
        DEFINE grade CHAR(1);
        LET grade = 'D';
        CASE grade
        WHEN 'A' THEN LET grade = 'a';
        WHEN 'B' THEN LET grade = 'b';
        WHEN 'C' THEN LET grade = 'c';  
        WHEN NULL THEN LET grade = 'z';
        ELSE LET grade = 'd';
        END CASE;
        RETURN grade;
        END PROCEDURE;

相关语句

IF

1 请参阅 语句块