CASE语句与CASE表达式
来源:互联网 发布:ubuntu root密码设置 编辑:程序博客网 时间:2024/05/16 12:09
CASE语句与CASE表达式
转自:http://blog.csdn.net/leshami/article/details/7340187
case语句与case表达式是plsql流程控制的重要组成部分,尽管其使用方法较为简单,但容易混淆。
本文将描述case语句与case表达式并给出演示以便于更好理解两者的异同及使用时的注意事项。
一、简单case语句
-->语法
CASE SELECTOR
WHEN EXPRESSION 1 THEN STATEMENT 1;
WHEN EXPRESSION 2 THEN STATEMENT 2;
...
WHEN EXPRESSION N THEN STATEMENT N;
ELSE STATEMENT N 1;
END CASE;
--简单的case语句是指SELECTOR中得到的值或结果与EXPRESSIONn中的值或结果相匹配,一旦找到匹配,则对应的语句被执行。直到找到为止。
--如果对应的EXPRESSION n 中没有匹配,则此时ELSE上阵,执行其后对应的语句。
--ELSE为可选项。如省略且when条件中未找到任何匹配项,则收到case_not_found异常。
-->演示简单case语句
sys@ORCL> DECLARE
2 v_num NUMBER:= &in_num;
3 v_flag NUMBER;
4 BEGIN
5 v_flag := MOD (v_num, 2);
6
7 CASE v_flag
8 WHEN 0
9 THEN
10 DBMS_OUTPUT.put_line (v_num || ' is even number');
11 WHEN 1
12 THEN
13 DBMS_OUTPUT.put_line (v_num || ' is odd number');
14 ELSE
15 NULL;
16 END CASE;
17 END;
18 /
Enter value for in_num: 5
5 is odd number
PL/SQL procedure successfully completed.
二、搜索式case语句
-->语法
CASE
WHEN SEARCH CONDITION 1 THEN STATEMENT 1;
WHEN SEARCH CONDITION 2 THEN STATEMENT 2;
...
WHEN SEARCH CONDITION N THEN STATEMENT N;
ELSE STATEMENT N 1;
END CASE;
--搜索式case语句与简单case语句长相不一样。首先是case 之后没有接selector,其次是when之后的SEARCHCONDITION n得到的结果为布尔型,
--当搜索到第一个为TRUE的STATEMENT的结果会被返回。若果所有的when之后的SEARCHCONDITION没有为TRUE的,则else之后的STATEMENT
--的结果会被返回。如果此时省略了else子句,等同于简单case语句,同样会收到case_not_found异常。谁叫他俩一母同胞呢?
-->下面演示搜索式case
scott@ORCL> DECLARE
2 v_num NUMBER :=&in_num;
3 BEGIN
4 CASE
5 WHEN v_num > 0
6 THEN
7 DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
8 WHEN v_num < 0
9 THEN
10 DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
11 ELSE
12 DBMS_OUTPUT.put_line (v_num || ' is zero ');
13 END CASE;
14 END;
15 /
Enter value for in_num: -3
-3 is a negative number
-->如下例所示所有的when之后的没有一个为true,且省略了else子句,那么迎接你的是CASEnot found
scott@ORCL> DECLARE
2 v_num NUMBER :=&in_num;
3 BEGIN
4 CASE
5 WHEN v_num > 0
6 THEN
7 DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
8 WHEN v_num < 0
9 THEN
10 DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
11 END CASE;
12 END;
13 /
Enter value for in_num: 0
DECLARE
*
ERROR at line 1:
ORA-06592: CASE not found while executing CASE statement
ORA-06512: at line 4
三、简单case语句与搜索式case语句的异同
--相同点:两者都用于根据不同的条件,来执行与之对应的语句或完成特定的任务,甚至某些情况下可以互换替换。
--不同点:
--简单case语句提供一个selector选择器,且EXPRESSION的数据类型一定与selector的数据类型匹配,否则报错。
--搜索case语句没有selector选择器,且when子句之后得到的结果一定是一个布尔型值(NULL,TRUR,FALSE)
--下面的例子是一个简单case与搜索case之间互换的例子,同时该方式也实现了行到列的转行。
scott@ORCL> select sum(case when deptno=20 then salend) as sal_sum_20, -->搜索式case方式
2 sum(case when deptno=30 then sal end) assal_sum_30
3 from emp where comm>300;
SAL_SUM_20 SAL_SUM_30
---------- ----------
13075 8300
转自:http://blog.csdn.net/leshami/article/details/7340187
case语句与case表达式是plsql流程控制的重要组成部分,尽管其使用方法较为简单,但容易混淆。
本文将描述case语句与case表达式并给出演示以便于更好理解两者的异同及使用时的注意事项。
一、简单case语句
-->语法
CASE SELECTOR
WHEN EXPRESSION 1 THEN STATEMENT 1;
WHEN EXPRESSION 2 THEN STATEMENT 2;
...
WHEN EXPRESSION N THEN STATEMENT N;
ELSE STATEMENT N 1;
END CASE;
--简单的case语句是指SELECTOR中得到的值或结果与EXPRESSIONn中的值或结果相匹配,一旦找到匹配,则对应的语句被执行。直到找到为止。
--如果对应的EXPRESSION n 中没有匹配,则此时ELSE上阵,执行其后对应的语句。
--ELSE为可选项。如省略且when条件中未找到任何匹配项,则收到case_not_found异常。
-->演示简单case语句
sys@ORCL> DECLARE
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Enter value for in_num: 5
5 is odd number
PL/SQL procedure successfully completed.
二、搜索式case语句
-->语法
CASE
WHEN SEARCH CONDITION 1 THEN STATEMENT 1;
WHEN SEARCH CONDITION 2 THEN STATEMENT 2;
...
WHEN SEARCH CONDITION N THEN STATEMENT N;
ELSE STATEMENT N 1;
END CASE;
--搜索式case语句与简单case语句长相不一样。首先是case 之后没有接selector,其次是when之后的SEARCHCONDITION n得到的结果为布尔型,
--当搜索到第一个为TRUE的STATEMENT的结果会被返回。若果所有的when之后的SEARCHCONDITION没有为TRUE的,则else之后的STATEMENT
--的结果会被返回。如果此时省略了else子句,等同于简单case语句,同样会收到case_not_found异常。谁叫他俩一母同胞呢?
-->下面演示搜索式case
scott@ORCL> DECLARE
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Enter value for in_num: -3
-3 is a negative number
-->如下例所示所有的when之后的没有一个为true,且省略了else子句,那么迎接你的是CASEnot found
scott@ORCL> DECLARE
2
3
4
5
6
7
8
9
10
11
12
13
Enter value for in_num: 0
DECLARE
*
ERROR at line 1:
ORA-06592: CASE not found while executing CASE statement
ORA-06512: at line 4
三、简单case语句与搜索式case语句的异同
--相同点:两者都用于根据不同的条件,来执行与之对应的语句或完成特定的任务,甚至某些情况下可以互换替换。
--不同点:
--简单case语句提供一个selector选择器,且EXPRESSION的数据类型一定与selector的数据类型匹配,否则报错。
--搜索case语句没有selector选择器,且when子句之后得到的结果一定是一个布尔型值(NULL,TRUR,FALSE)
--下面的例子是一个简单case与搜索case之间互换的例子,同时该方式也实现了行到列的转行。
scott@ORCL> select sum(case when deptno=20 then salend) as sal_sum_20,
2
3
SAL_SUM_20 SAL_SUM_30
---------- ----------
13075