CASE ステートメント Oracle PL/SQLと例

⚡ スマートサマリー

PL/SQLのCASE文は、セレクタに基づいて複数の選択肢の中から1つを選択します。IF-THEN-ELSIF文に似ていますが、より分かりやすいです。単純なCASE文はセレクタの値に一致するのに対し、検索型CASE文は各WHEN句の条件を評価し、最初に真となった条件を実行します。

  • 🔀 目的: CASEは、ブールチェーンではなくセレクターを使用して、複数のアクションブロックの中から1つを選択します。
  • 🎯 セレクタ: CASE式は一度評価され、各WHEN値と比較されます。
  • 🔎 検索されたケース: 各WHEN句に完全な条件を設定し、最初に真となった条件を実行します。
  • 🧮 種類は問いません: セレクターは、変数、数値、または算術式を指定できます。
  • 🛟 ELSE: オプションのELSEブロックは、代替条件に一致するものがなかった場合に実行されます。
  • 🔚 終了ケース: 必須のEND CASE文でステートメントが閉じられます。
  • 🗄️ SQLフレンドリー: IFとは異なり、CASEはSQL文の中で直接使用することもできます。

CASE ステートメント Oracle PL / SQLの

CASEステートメントとは何ですか?

CASE文はIF-THEN-ELSIF文に似ており、条件に基づいて利用可能な選択肢の中から1つの選択肢を選びます。

  • CASE文は、ブール式ではなく「セレクタ」を使用して処理順序を選択します。
  • CASE文の式の値はセレクタとして扱われます。
  • その式は、どのような型(算術式、変数など)でも構いません。
  • 各選択肢にはあらかじめ定義された値(セレクタ)が割り当てられ、セレクタの値が条件式の値と一致する選択肢が実行されます。
  • IF-THEN-ELSIF とは異なり、CASE ステートメントは SQL ステートメントでも使用できます。
  • CASE文のELSEブロックには、いずれの選択肢も選ばれなかった場合に実行される処理シーケンスが格納されます。

構文

CASE (expression)
WHEN <value1> THEN action_block1;
WHEN <value2> THEN action_block2;
WHEN <value3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • 上記の構文では、式は任意の型の値を返す可能性があります。
  • 各「WHEN」条項は、そして。
  • 式に一致する値を持つ「WHEN」句が選択され、その実行されます。
  • 「ELSE」ブロックはオプションで、代替案が見つからない場合に実行する。
  • 「END」はCASE文の終わりを示し、CASE文の必須要素です。

例1:CASE文を用いた算術計算

この例では、55と5という2つの数値の間で算術計算を行います。

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'MULTIPLY';
BEGIN
dbms_output.put_line('Program started.');
CASE (arth_operation)
WHEN 'ADD' THEN dbms_output.put_line('Addition of the numbers are: '|| a+b );
WHEN 'SUBTRACT' THEN dbms_output.put_line('Subtraction of the numbers are: '||a-b );
WHEN 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are:'|| a/b);
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code 説明

  • Code 2行目: 変数「a」を「NUMBER」として宣言し、値「55」で初期化します。
  • Code 3行目:変数「b」を「NUMBER」として宣言し、値「5」で初期化します。
  • Code 4行目: 変数「arth_operation」をサイズ20の「VARCHAR2」として宣言し、値「MULTIPLY」で初期化します。
  • Code 6行目:「プログラムが開始されました」という文を出力します。
  • Code 7行目:CASE文は式の値をチェックします。ここでは、「arth_operation」の値は「MULTIPLY」であり、これがセレクタとして扱われます。
  • Code 10行目: 値が「MULTIPLY」のWHEN句がセレクタに一致するため、コントローラはこのアクションブロックを選択し、「数値の乗算結果は: 275」と出力します。
  • Code 13行目:CASE文の終わりを示します。
  • Code 14行目:「プログラムが完了しました」という文を出力します。

Code 出力

Program started.
Multiplication of the numbers are: 275
Program completed.

SEARCHED CASE ステートメント

検索対象のCASE文は、通常のCASE文と似ていますが、セレクタを使用して代替案を選択するのではなく、WHEN句で条件が直接定義されています。

  • 条件を満たす最初のWHEN句が実行され、コントローラは残りの選択肢をスキップします。

構文

CASE
WHEN <expression1> THEN action_block1;
WHEN <expression2> THEN action_block2;
WHEN <expression3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • 上記の構文では、各 WHEN 句は別個のそして。
  • 式がTRUEを返すWHEN句が実行されます。
  • 「ELSE」ブロックはオプションで、いずれの選択肢も満たされない場合に実行する。
  • 「END」はCASE文の終わりを示し、CASE文の必須要素です。

例1:検索されたケースを使用した算術計算

この例では、55と5という2つの数値の間で算術計算を行います。

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'DIVIDE';
BEGIN
dbms_output.put_line('Program started.');
CASE
WHEN arth_operation = 'ADD'
THEN dbms_output.put_line('Addition of the numbers are: '||a+b );
WHEN arth_operation = 'SUBTRACT'
THEN dbms_output.put_line('Subtraction of the numbers are: '|| a-b);
WHEN arth_operation = 'MULTIPLY'
THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN arth_operation = 'DIVIDE'
THEN dbms_output.put_line('Division of the numbers are: '|| a/b );
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code 説明

  • Code 2行目: 変数「a」を「NUMBER」として宣言し、値「55」で初期化します。
  • Code 3行目:変数「b」を「NUMBER」として宣言し、値「5」で初期化します。
  • Code 4行目: 変数「arth_operation」をサイズ20の「VARCHAR2」として宣言し、値「DIVIDE」で初期化します。
  • Code 6行目:「プログラムが開始されました」という文を出力します。
  • Code 7行目:検索対象のCASE文が始まります。ADD、SUBの句TRACT と MULTIPLY は、条件が 'arth_operation' の値と一致しないためスキップされます。
  • Code 14行目: WHEN句の式「arth_operation = 'DIVIDE'」が満たされ、TRUEが返されます。
  • Code 15行目:WHEN句のアクションブロックが実行され、「数値の割り算は:11」と表示されます。
  • Code 17行目:CASE文の終わりを示します。
  • Code 18行目:「プログラムが完了しました」という文を出力します。

Code 出力

Program started.
Division of the numbers are: 11
Program completed.

事例と検索事例の比較

どちらの形式も1つの枝を選択するが、枝の選択方法が異なり、以下にその概要を示す。

タイプ 詳細説明 使用法
HOUSES に似て イフ・ザ・エルシフ ステートメント。ブール式の代わりに「セレクタ」を使用して選択肢を選択します。 セレクターを使用して複数の選択肢から選択するために使用されます。
検索されたケース 実際のセレクタを持たないCASE文。代わりに、選択肢を選択する条件(TRUEまたはFALSEに評価される)が含まれています。 主に射程距離などの条件に基づいて、2つ以上の選択肢から選ぶ場合に使用される。

よくあるご質問

単純なCASE文は、1つのセレクタ値を各WHEN値と比較します。検索型CASE文はセレクタを持たず、各WHEN内の完全な条件を評価するため、範囲指定や複合テストに対応できます。

はい。CASE式はSELECT、WHERE、またはORDER BY句で使用できます。これは、PL/SQLブロック内でのみ機能するIF-THEN-ELSIF構文に比べて大きな利点です。

CASE文は、一致する分岐がなく、かつELSEも存在しない場合にCASE_NOT_FOUND例外を発生させます。ELSE(空のNULLアクションであっても)を追加することで、この実行時エラーを回避できます。

はい。分岐が1つの式を固定値と比較する場合、AIはチェーンをより簡潔なCASE文として書き換えることができます。ELSEのないCASE文はELSIFがない場合とは異なる動作をするため、結果を確認してください。

CASE文は、分岐ごとにアクションブロックを実行し、END CASEで終了します。CASE式は単一の値を返し、ENDで終了するため、変数に代入したり、SQLで使用したりできます。