すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CASEステートメント

最終更新日:May 30, 2024

CASEステートメントは、指定された検索条件がTRUEの場合、1つ以上のステートメントのセットを実行します。 CASEステートメントはスタンドアロンステートメントですが、前述のCASE式は式の一部として表示する必要があります。

CASEステートメントには2つの形式があります。 1つは検索CASEと呼ばれ、もう1つはセレクタを使用します。

セレクタCASEステートメント

selector CASEステートメントは、selectorと呼ばれる式を、1つ以上のWHEN句で指定された式と照合しようとします。 一致が見つかると、1つ以上の対応するステートメントが実行される。

CASEセレクター式
  一致式が残ったとき
    ステートメント
[一致表現があったとき]
    ステートメント
[一致表現があったとき]
    ステートメント] ...]
[ELSE
    ステートメント]
  エンドケース; 

selector-expressionは、各match-expressionと型互換性のある値を返します。 match-expressionは、CASEステートメント内で表示される順序で評価されます。 ステートメントは、それぞれがセミコロンで終わる1つ以上のSPLステートメントを示します。 selector-expressionの値が最初のmatch-expressionに等しい場合、対応するTHEN句のステートメントが実行され、END CASEキーワードに続いて制御が続行されます。 一致が見つからない場合、ELSEに続くステートメントが実行される。 一致が見つからず、ELSE句が存在しない場合、例外がスローされます。

次の例では、セレクターCASEステートメントを使用して、部門番号に基づいて部門名と場所を変数に割り当てます。

DECLARE
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_deptno        emp.deptno%TYPE;
    v_dname         dept.dname%TYPE;
    v_loc dept.loc % TYPE;
    CURSOR emp_cursorはSELECT empno, ename, deptno FROM emp;
開始
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO ENAME DEPTNO DNAME ')
        | | | 'LOC');
    DBMS_OUTPUT.PUT_LINE('----- ------- -----------'
        || '     ---------');
    LOOP
        FETCH emp_cursorにインv_empno、v_ename、v_deptno;
        emp_cursor % NOTFOUND;
        ケースv_deptno
            10 THEN v_dname := 'Accounting ';
                         v_loc := 'New York';
            20がv_dnameの場合:= '研究';
                         v_loc := 'Dallas';
            30 THEN v_dname := 'Sales ';
                         v_loc := 'Chicago';
            40 THEN v_dname := 'Operations';
                         v_loc := 'Boston';
            ELSE v_dname := 'unknown';
                         v_loc := '';
        END CASE;
        DBMS_OUTPUT.PUT_LINE(v_empno | | '| | RPAD(v_ename, 10) | | |
            '| | v_deptno | |' | | RPAD(v_dname、14) | | '| |
            v_loc);
    END LOOP;
    閉じるemp_cursor;
エンド; 

このプログラムから次の出力が生成されます。

EMPNO ENAME DEPTNO DNAME LOC
----- ------- ------ ------------ ---------------
7369 SMITH 20 Researchダラス
7499 ALLEN 30 Salesシカゴ
7521 WARD 30 Salesシカゴ
7566ジョーンズ20リサーチダラス
7654 MARTIN 30 Salesシカゴ
7698 BLAKE 30 Salesシカゴ
7782 CLARK 10経理ニューヨーク
7788 SCOTT 20 Researchダラス
7839キング10会計ニューヨーク
7844 TURNER 30 Salesシカゴ
7876 ADAMS 20 Researchダラス
7900 JAMES 30 Salesシカゴ
7902フォード20研究ダラス
7934ミラー10会計ニューヨーク 

検索されたCASEステートメント

検索されたCASEステートメントは、1つ以上のブール式を使用して、実行するステートメントの結果セットを決定します。

ブール式が存在する場合の
ケース
    ステートメント
[ブール式があれば
    ステートメント
[ブール式があれば
    ステートメント] ...]
[ELSE
    ステートメント]
  エンドケース; 

ブール式は、CASEステートメント内で表示される順序で評価されます。 TRUEに評価される最初のブール式に遭遇すると、対応するTHEN句のステートメントが実行され、END CASEキーワードに続いて制御が続行されます。 ブール式のいずれもがTRUEに評価されない場合、ELSEに続くステートメントが実行されます。 ブール式のいずれもTRUEに評価されず、ELSE句が存在しない場合、例外がスローされます。

次の例では、検索されたCASEステートメントを使用して、部門番号に基づいて部門名と場所を変数に割り当てます。

DECLARE
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_deptno        emp.deptno%TYPE;
    v_dname         dept.dname%TYPE;
    v_loc dept.loc % TYPE;
    CURSOR emp_cursorはSELECT empno, ename, deptno FROM emp;
開始
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO ENAME DEPTNO DNAME ')
        | | | 'LOC');
    DBMS_OUTPUT.PUT_LINE('----- ------- -----------'
        || '     ---------');
    LOOP
        FETCH emp_cursorにインv_empno、v_ename、v_deptno;
        emp_cursor % NOTFOUND;
        CASE
            v_deptno = 10 THEN v_dname := 'Accounting ';
                                    v_loc := 'New York';
            v_deptno = 20 THEN v_dname := 'Research';
                                    v_loc := 'Dallas';
            v_deptno = 30のときv_dname := 'Sales ';
                                    v_loc := 'Chicago';
            v_deptno = 40時v_dname := 'Operations';
                                    v_loc := 'Boston';
            ELSE v_dname := 'unknown';
                                    v_loc := '';
        END CASE;
        DBMS_OUTPUT.PUT_LINE(v_empno | | '| | RPAD(v_ename, 10) | | |
            '| | v_deptno | |' | | RPAD(v_dname、14) | | '| |
            v_loc);
    END LOOP;
    閉じるemp_cursor;
エンド; 

このプログラムから次の出力が生成されます。

EMPNO ENAME DEPTNO DNAME LOC
----- ------- ------ ------------ ---------------
7369 SMITH 20 Researchダラス
7499 ALLEN 30 Salesシカゴ
7521 WARD 30 Salesシカゴ
7566ジョーンズ20リサーチダラス
7654 MARTIN 30 Salesシカゴ
7698 BLAKE 30 Salesシカゴ
7782 CLARK 10経理ニューヨーク
7788 SCOTT 20 Researchダラス
7839キング10会計ニューヨーク
7844 TURNER 30 Salesシカゴ
7876 ADAMS 20 Researchダラス
7900 JAMES 30 Salesシカゴ
7902フォード20研究ダラス
7934ミラー10会計ニューヨーク