• Oracle IF & CASE语句


    IF语句主要有以下三种基本形式:

    一、 IF-THEN语句

           IF CONDITION THEN
               STATEMENT 1;
               ...
               STATEMENT N;
           END IF;

    二、 IF-THEN-ELSE语句

           IF CONDITION THEN
               STATEMENT 1;
           ELSE
               STATEMENT 2;
           END IF;

    三、 ELSLF语句

           IF CONDITION 1 THEN
               STATEMENT 1;
           ELSIF CONDITION 2 THEN
               STATEMENT 2;
           ELSIF CONDITION 3 THEN
               STATEMENT 3;
                ...
           ELSE
               STATEMENT N;  -->>在ELSIF语句中,ELSE子句并不是必需的
           END IF

    下面,试举一例:用SYSDATE函数判断今天是否是周末,如果是周末的话,判断现在是上午还是下午。无论是否是周末,最后均显示日期。

    注意:IF的嵌套用法和在ELSIF语句中,ELSE子句并不是必需的

           DECLARE
                 v_day varchar2(10);
                 v_time number(2);
           BEGIN
                 v_day := RTRIM(to_char(sysdate,'DAY'));
                 v_time := to_char(sysdate,'hh24');
                 IF v_day in ('SATURDAY','SUNDAY') THEN   -->>下面嵌套了一个ELSIF语句
                         IF v_time >= 6 AND v_time <12 THEN
                                DBMS_OUTPUT.PUT_LINE('Good Moring');
                         ELSIF v_time >=12 AND v_time <=18 THEN
                                DBMS_OUTPUT.PUT_LINE('Good Afternoon');
                         END IF;
                 END IF;
                 DBMS_OUTPUT.PUT_LINE('The time is: '||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
            END;

      

    CASE语句

    CASE语句存在两种形式: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;

    下面,试举一例:用于判断输入数值的奇偶性。

    DECLARE
      v_num NUMBER := &user_num;
      v_num_flag NUMBER;
    BEGIN
      v_num_flag := MOD(v_num,2);
      CASE v_num_flag
        WHEN 0 THEN
          DBMS_OUTPUT.PUT_LINE(v_num||' is even number');
        ELSE
          DBMS_OUTPUT.PUT_LINE(v_num||' is odd number');
      END CASE;
    END;

    二、 搜索式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语句重写上例  -->> 注意:没有声明v_num_flag变量,直接在WHEN中判断

    DECLARE
      v_num NUMBER := &user_num;
    BEGIN
      CASE
        WHEN MOD(v_num,2)=0 THEN
          DBMS_OUTPUT.PUT_LINE(v_num||' is even number');
        ELSE
          DBMS_OUTPUT.PUT_LINE(v_num||' is odd number');
      END CASE;
    END;

    CASE表达式

    倘若是使用CASE表达式,上述CASE语句和搜索式CASE语句可分别重写如下:

    一、 对应CASE语句

    DECLARE
      v_num NUMBER := &user_num;
      v_num_flag number;
      v_result varchar2(30);
    BEGIN
      v_num_flag := MOD(v_num,2);
      v_result :=
        CASE v_num_flag
           WHEN 0 THEN
              v_num||' is even number'
           ELSE
              v_num ||' is odd number'
        END;
      DBMS_OUTPUT.PUT_LINE(v_result);
    END;

    二、 对应搜索式CASE语句

    DECLARE
      v_num NUMBER := &user_num;
      v_result varchar2(30);
    BEGIN
      v_result :=
        CASE
           WHEN MOD(v_num,2) =  0 THEN
              v_num||' is even number'
           ELSE
              v_num ||' is odd number'
        END;
      DBMS_OUTPUT.PUT_LINE(v_result);
    END;

    注意:CASE语句和CASE表达式之间的语法区别:在CASE语句中,WHEN和ELSE子句中的可执行语句以分号结尾。而在CASE表达式中,WHEN和ELSE子句所包含的表达式的结尾处不是分号。CASE语句以END CASE终止,CASE表达式以END结尾。

    CASE表达式常用于SELECT INTO语句中,试举一例:

    DECLARE
      v_sal_level varchar2(10);
      v_empno number(4) :=&empno;
      v_name varchar2(10);
    BEGIN
      SELECT ename,
             CASE
                WHEN sal >= 3000 THEN 'high'
                WHEN sal >= 1000 THEN 'medium'
                ELSE 'low'
             END
        INTO v_name,v_sal_level
        FROM emp
       WHERE EMPNO = v_empno;
       DBMS_OUTPUT.PUT_LINE(v_name||' salary is '||v_sal_level);
    END;

       

           

  • 相关阅读:
    洛谷P3674 小清新人渣的本愿
    洛谷P3709 大爷的字符串
    CF747F Igor and Interesting Numbers
    洛谷P1494 小Z的袜子
    洛谷P3396 哈希冲突
    分块⑨题
    洛谷P4219 大融合
    bzoj2959 长跑
    洛谷P2486 染色
    洛谷P4382 劈配
  • 原文地址:https://www.cnblogs.com/ivictor/p/3875489.html
Copyright © 2020-2023  润新知