Oracle PL/SQL IF THEN ELSE 文: ELSIF、NESTED-IF

⚡ スマートサマリー

PL/SQLの意思決定ステートメントは、ブール条件に基づいてどのコードを実行するかを制御します。 Oracle IF-THEN、IF-THEN-ELSE、IF-THEN-ELSIF、およびNESTED-IFを提供するため、プログラムはブロックをスキップしたり、2つのパスから選択したり、複数の選択肢から1つを選択したりできます。

  • 🔀 目的: TRUEまたはFALSEを返す条件によって、実行の流れが決まります。
  • もし~ならば: 条件が真の場合にのみブロックを実行し、そうでない場合はスキップします。
  • ↔️ IF-THEN-ELSE: TRUE用とFALSE用の2つのブロックから選択します。
  • 🪜 IF-THEN-ELSIF: 条件を順番にテストし、TRUEとなる最初の条件を実行します。オプションでELSE条件も使用できます。
  • 🧩 ネストされたIF: 条件を組み合わせるために、IF文の中に別のIF文を配置します。
  • ⚠️ NULLルール: NULLと評価される条件はFALSEとして扱われます。
  • 🔚 ターミネーター: すべてのIF文は、対応するEND IF文で閉じなければなりません。

Oracle PL/SQL IF THEN ELSE ELSIF

意思決定ステートメントとは何ですか?

意思決定ステートメントはフロー制御を決定します SQL 条件に基づいたステートメント。これにより、プログラマは特定のブロックの実行を阻止したり、条件に基づいて目的のブロックを選択したりする際に、より詳細な制御が可能になります。以下に、意思決定ステートメントを図で示します。

意思決定ステートメントの図
意思決定ステートメントの図

意思決定に関する記述の種類: Oracle 以下の種類を提供します。

  • IF-THEN
  • イフ・ザ・エルス
  • イフ・ザ・エルシフ
  • 入れ子のIF
  • HOUSES
  • 検索されたケース

このチュートリアルでは、IF のバリアントについて説明します。CASE と検索 CASE 形式については、 PL/SQL CASE文 ガイド。

IF-THEN ステートメント

IF-THEN ステートメントは、条件が満たされた場合にのみコードの特定の部分を実行するために使用されます。条件は、 ブーリアン (真/偽)値。これは基本的な条件文であり、 Oracle 事前に定義された条件に基づいて、コードの一部を実行するかスキップするかを決定します。

IF-THEN文の構文:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block>
END IF;
  • 上記の構文では、キーワード「IF」の後に「TRUE」または「FALSE」と評価される条件が続きます。
  • コントロールは条件が返される場合のみ。
  • 条件が評価された場合SQL はスキップしますそして、「END IF」ブロックの後のコードの実行を開始します。

注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。

例1: この例では、数値が100より大きい場合にメッセージを表示します。

DECLARE
a NUMBER := 10;
BEGIN
dbms_output.put_line('Program started.');
IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 説明:

  • Code 2行目: 変数「a」を「NUMBER」データ型として宣言し、値「10」で初期化します。
  • Code 4行目:「プログラムが開始されました」という文を出力します。
  • Code 5行目:変数「a」が「100」より大きいかどうかという条件をチェックします。
  • Code 6行目:'a'が'100'より大きい場合、「aは100より大きい」と表示されます。'a'が100以下の場合、条件を満たさないため、表示文は無視されます。
  • Code 8行目:「プログラムが完了しました」という文を出力します。

Code 出力:

Program started.
Program completed.

例2: この例では、指定された文字が英語の母音(A、E、I、O、U)である場合にメッセージを出力します。

DECLARE
a CHAR(1) := 'u';
BEGIN
IF UPPER(a) in ('A','E','I','O','U' ) THEN
dbms_output.put_line('The character is in English Vowels');
END IF;
END;
/

Code 説明:

  • Code 2行目: 変数「a」をサイズ「1」の「CHAR」型として宣言し、値「u」で初期化します。
  • Code 4行目: 変数「a」がリスト(「A」、「E」、「I」、「O」、「U」)に含まれているかどうかを確認します。比較時に大文字小文字を区別しないようにするため、「a」の値は比較前に大文字に変換されます。
  • Code 5行目: リストに「a」が含まれている場合、「この文字は英語の母音です」と表示されます。条件を満たさない場合、IF-THENブロックの外に出力文がないため、このプログラムは何も出力しません。

Code 出力:

The character is in English Vowels

IF-THEN-ELSE ステートメント

IF-THEN-ELSE文は、条件に基づいて2つの選択肢から1つを選択するために使用されます。構文は以下のとおりです。

IF-THEN-ELSE ステートメントの構文:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSE
-execute if the condition failed (returns FALSE)
<action_block2>
END IF;
  • キーワード「IF」の後には、「TRUE」または「FALSE」と評価される条件が続きます。
  • コントロールが実行されます条件が返される場合のみ。
  • 条件が評価された場合SQLが実行されます。
  • いずれにせよ、2つのアクションブロックのうち1つが実行されます。

注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。

例1: この例では、与えられた数値が奇数か偶数かを出力します。

DECLARE
a NUMBER:= 11;
BEGIN
dbms_output.put_line ('Program started');
IF( mod(a,2)=0) THEN
dbms_output.put_line('a is even number');
ELSE
dbms_output.put_line('a is odd number');
END IF;
dbms_output.put_line ('Program completed.');
END;
/

Code 説明:

  • Code 2行目: 変数「a」を「NUMBER」データ型として宣言し、値「11」で初期化します。
  • Code 4行目:「プログラムが開始されました」という文を出力します。
  • Code 5行目: 変数「a」の「2」による剰余が0かどうかを確認します。
  • Code 6行目:もし「0」であれば、「aは偶数です」と表示されます。
  • Code 7行目: モジュラス値が「0」でない場合、条件はそのため、「aは奇数です」と表示されます。
  • Code 10行目:「プログラムが完了しました」という文を出力します。

Code 出力:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF ステートメント

  • IF-THEN-ELSIF文は、複数の選択肢の中から1つを選択する必要がある場合に使用されます。各選択肢にはそれぞれ独自の条件があります。
  • 最初の条件はが実行され、残りの条件はスキップされます。
  • IF-THEN-ELSIF文には、いずれの条件も満たされない場合に実行される「ELSE」ブロックを含めることができます。

注意: ELSEブロックは省略可能です。ELSEブロックがなく、かつどの条件も満たされない場合、コントローラはすべてのアクションブロックをスキップし、残りのコードを実行します。

IF-THEN-ELSIF ステートメントの構文:

IF <condition1: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSIF <condition2: returns Boolean> THEN
<action_block2>
ELSIF <condition3: returns Boolean> THEN
<action_block3>
ELSE --optional
<action_block_else>
END IF;
  • コントロールが実行されますcondition1 が返した場合のみ。
  • 条件1が満たされない場合、コントローラは条件2をチェックし、以下同様に続きます。
  • コントローラは、条件が満たされるとIF文を終了します。そして、一致するアクション ブロックを実行するか、いずれの条件も満たされず、ELSE ブロックが存在する場合は、そのブロックを実行します。

注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。

例1:ELSEブロックなしの場合。 この例では、else条件なしで、指定された点数に基づいて成績を出力します(点数 >= 70 で A、点数 >= 40 かつ点数 < 70 で B、点数 >= 35 かつ点数 < 40 で C)。

DECLARE
mark NUMBER := 55;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 説明:

  • Code 2行目: 変数「mark」を「NUMBER」データ型として宣言し、値「55」で初期化します。
  • Code 4行目:「プログラムが開始されました」という文を出力します。
  • Code 5行目: 条件1、つまり「mark」が70以上かどうかを確認します。
  • Code 7行目: condition1が失敗したため、condition2 '70 > mark >= 40'がチェックされます。
  • Code 8行目: Condition2が返しますそのため、「グレードB」というメッセージが印刷されます。
  • Code 12行目:「プログラムが完了しました」という文を出力します。条件3「mark < 35」は、既にTRUE条件が見つかったためスキップされます。

Code 出力:

Program started.
Grade B
Program completed.

例2:ELSEブロックを使用する場合。 この例では、else条件(点数が70点以上の場合A、点数が40点以上70点未満の場合B、点数が35点以上40点未満の場合C、それ以外の場合「成績なし」)に基づいて、指定された点数に基づいて成績を出力します。

DECLARE
mark NUMBER := 25;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
ELSE
dbms_output.put_line('No Grade');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 説明:

  • Code 2行目: 変数「mark」を「NUMBER」データ型として宣言し、値「25」で初期化します。
  • Code 4行目:「プログラムが開始されました」という文を出力します。
  • Code 5行目: 条件1、つまり「mark」が70以上かどうかを確認します。
  • Code 7行目: condition1が失敗したため、condition2 '70 > mark >= 40'がチェックされます。
  • Code 9行目: condition2が失敗したため、condition3 '40 > mark >= 35'がチェックされます。
  • Code 11行目: すべての条件が満たされなかったため、制御はELSEブロックをチェックし、「成績なし」と出力します。
  • Code 14行目:「プログラムが完了しました」という文を出力します。

Code 出力:

Program started.
No Grade
Program completed.

NESTED-IF ステートメント

  • NESTED-IF ステートメントを使用すると、プログラマーは 1 つ以上の 'IF' 条件を別の 'IF' 条件の中に配置できます。 。
  • 各「IF」条件には、その条件の適用範囲の終わりを示す個別の「END IF」ステートメントが必要です。 。
  • 「IF」文は、最も近い「END IF」をその条件の終点とみなします。
  • ネストされたIFの図解を以下に示します。

ネストされたIF文の流れ

ネストされたIF文の構造

IF <condition1: returns Boolean>
THEN
--executed only if the condition returns TRUE
<action block1 starts>
IF <condition2: returns Boolean>
THEN
<action_block2>
END IF; --END IF corresponds to condition2
<action_block1 ends>
END IF; --END IF corresponds to condition1

構文の説明:

  • 外側のIF文には、アクションブロック内にさらに1つのIF文が含まれています。
  • condition1 が返した場合制御が実行されるそして条件2をチェックします。
  • condition2 も返す場合、 それからも実行されます。
  • condition2 が評価される場合SQLスキップ。

ネストされたIF文の例:3つの数値の中で最大のもの。 この例では、ネストされたif文を使用して、3つの数値のうち最大の値を出力します。数値は宣言部分で割り当てられ(Number = 10、15、20)、ネストされたif文を使用して最大値を取得します。

DECLARE
a NUMBER := 10;
b NUMBER := 15;
c NUMBER := 20;
BEGIN
dbms_output.put_line('Program started.');
IF( a > b)THEN
/*Nested-if 1 */
dbms_output.put_line('Checking Nested-IF 1');
IF( a > c ) THEN
dbms_output.put_line('A is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
ELSE
/*Nested-if2 */
dbms_output.put_line('Checking Nested-IF 2');
IF( b > c ) THEN
dbms_output.put_line('B is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 説明:

  • Code 2~4行目:変数「a」、「b」、「c」を「NUMBER」型として宣言し、それぞれ10、15、20で初期化します。
  • Code 6行目:「プログラムが開始されました」という文を出力します。
  • Code 7行目:条件1、つまり「a」が「b」より大きいかどうかを確認します。
  • Code 10行目: 'a'が'b'より大きい場合、ネストされたif 1は'a'が'c'より大きいかどうかをチェックします。
  • Code 11~13行目:もし「a」がさらに大きい場合は「Aが最大」と表示され、そうでない場合は「Cが最大」と表示されます。
  • Code 18行目: condition1がfalseを返すと、ネストされたif 2は'b'が'c'より大きいかどうかをチェックします。
  • Code 19~21行目:'b'が'c'より大きい場合は'B is greatest'と表示され、そうでない場合は'C is greatest'と表示されます。
  • Code 24行目:「プログラムが完了しました」という文を出力します。

コードの出力:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

意思決定に関する記述の比較

以下の表は、これまで説明してきた様々な条件文をまとめたものです。これを参考に、状況に応じて適切な条件文を選択してください。

タイプ 詳細説明 使用法
IF-THEN ブール条件をチェックします。TRUEの場合、「THEN」ブロック内のコードが実行されます。 条件に基づいて特定のブロックをスキップまたは実行する。
イフ・ザ・エルス ブール条件をチェックします。TRUEの場合は「THEN」ブロックが実行され、FALSEの場合は「ELSE」ブロックが実行されます。 「どちらか一方を選ぶ」状況で最も適切です。
イフ・ザ・エルシフ 条件を順番にチェックします。最初にTRUEを返すブロックが実行されます。いずれの条件もTRUEでない場合は、「ELSE」ブロックが実行されます。 2つ以上の選択肢から選ぶ際に使用する。
入れ子のIF 別のIF-THENまたはIF-THEN-ELSIFステートメントの中に、1つ以上のIF-THENまたはIF-THEN-ELSIFステートメントを挿入できます。 主にネストされた条件分岐の状況で使用されます。

よくあるご質問

ELSIFは、相互に排他的な条件の連続したシーケンスをテストします。ネストされたIFでは、ある条件が別の条件の中に含まれるため、内側のテストは外側の条件がTRUEになった後にのみ実行されます。

NULLと評価される条件はFALSEとして扱われるため、そのTHENブロックはスキップされます。比較対象の値がNULLになる可能性がある場合、このことは重要になります。なぜなら、初心者が期待するような形で分岐が実行されないからです。

1つの式を複数の固定値と比較する場合、CASE文の方が分かりやすい。IF-THEN-ELSIFは、関連性のない範囲条件に適している。どちらも同じ論理を表現できるが、値の照合においてはCASE文の方が読みやすい。

はい。AIはネストされたIF文をELSIFチェーンまたはCASE文にフラット化し、決して到達しない条件を検出できます。条件の順序を変更すると実行される分岐が変わる可能性があるため、書き換え後のコードをテストしてください。

END IF は条件ブロックの終了位置を示すもので、IF 文がネストされている場合は必須です。これがないと、コンパイラはどの文が条件に該当するかを判断できず、エラーが発生します。