本章主要讨论 case 语句
1: case [SELECTOR]
2: when expression 1 then statement 1;
3: when expression 2 then statement 2;
4: ...
5: when expression N then statement N;
6: else statement N+1;
7: end case;
注意: pl/sql 中的 case 没有 break;
1: declare
2: v_num number := &sv_user_num;
3: v_num_flag number;
4: begin
5: v_num_flage := mod(v_num, 2);
6: case v_num_flag
7: when 0 then
8: dbms_output.put_line(v_num || 'is even number');
9: else
10: dbms_output.put_line(v_num || 'is odd number');
11: end case;
12: dbms_output.put_line('Done');
13: end;
14: /
15: show errors;
注意: case 语句有两种形式,
1. 普通形式的 case 语句, 如上例 (有选择器, SELECTOR)
2. 搜索形式的 case 语句, 即 case 关键词后边没有跟表达式, 而是直接逻辑判断 when 后边的 expression , 如果为真就执行, 如下例子: (没有选择器, SELECTOR)
1: -- 不带选择器的(SELECTOR)CASE语句
2: declare
3: v_num number := &sv_user_num;
4: v_num_flag number;
5: begin
6: case
7: when MOD(v_num, 2) = 0 then
8: dbms_output.put_line(v_num || 'is even number');
9: else
10: dbms_output.put_line(v_num || 'is odd number');
11: end case;
12: dbms_output.put_line('Done');
13: end;
14: /
15: show errors;
使用 case 表达式 (表达式一定要与变量对应)
1: -- case 表达式
2: declare
3: v_num number := &sv_user_num;
4: v_num_flag number;
5: v_result varchar2(30);
6: begin
7: v_num_flag := mod(v_num, 2);
8:
9: v_result :=
10: case v_num_flag
11: when 0 then v_num || 'is even number'
12: else v_num || ' is odd number'
13: end; -- 注意: 这只是 end, 而不是 end case
14:
15: end;
16: /
17: show errors;
BULLIF, COALESCE 函数
NULLIF(expression1, expression2), 如果 expression1 = expression2, 返回 null, 否则 返回 expression1. 这个函数与 NVL 函数相反
例如:
1: declare
2: v_num number := &sv_user_num;
3: v_remainder number;
4: begin
5: v_remainder := NULLIF(MOD(v_num, 2), 0); -- 函数会返回值
6: end;
7: /
8: show errors;
COALESCE(expression1, expression2, …, expressionN), 若果expression1 是null, 就确认expression2, 如果expression2 也是null, 就确认expression3 以此类推, 直到一个不为null 的值. 如果所有的expression都是null, 那么这个函数就返回 null.