SELECT

目的

条件に応じて複数に分岐する SELECT グループの先頭に記述します。

構文

SELECT[(select-expression)]; 
   WHEN(e⊃1[,e⊃2[,e⊃3[…]]]) action_1; 
   WHEN(e⊃4[,e⊃5[,e⊃6[…]]]) action_2;
   .
   .
   .
   OTHERWISE action_m; 
END;

省略形:OTHERWISE の代わりに OTHER を使用できます。

パラメーター

select-expression および e⊃1, e⊃2... はいずれも有効な式で、各アクションは単一の文、複合文、DO グループ、SELECT グループ、ON-unit、または BEGIN ブロックです。

説明

SELECT 文は、条件に応じて複数に分岐する SELECT グループの先頭に記述します。SELECT 文は SELECT グループの式をテストし、テストの結果が真であれば特定のアクションを実行します。

SELECT;
   WHEN (condition B)
      SELECT;
            WHEN (condition B1) statement_1; 
            WHEN (condition B2) statement_2;
      END;
   WHEN (condition C)
      SELECT;
            WHEN (condition C1) statement_3; 
            WHEN (condition C2) statement_4; 
            OTHERWISE statement_5;
      END;
   OTHERWISE statement_6;
END;

B と B1 の両方の条件が真であれば statement_1 が実行され、B と B2 の両方の条件が真であれば statement_2 が実行されます。B が真であっても、B1 と B2 が偽であれば、いずれも実行されません。条件 B が偽の場合、C の条件がチェックされます。条件 B が偽で条件 C が真の場合、C1 と C2 のいずれの条件も偽であれば、statement_5 が実行されます。条件 B と条件 C がいずれも偽の場合は、statement_6 が実行されます。

SELECT 文で select-expression が指定されている場合は、制御がその文に達すると select-expression が評価され、その値が保存されます。次に、WHEN 句の式が記述されている順に評価され、各値が select-expression の値と比較されます。select-expression の値と等しい値が見つかると、対応する WHEN 句に続くアクションが実行され、以降の WHEN 句の式は評価されません。WHEN 句の式に select-expression と等しい式がない場合、OTHERWISE 句が指定されていれば、その句の後に指定されているアクションが無条件に実行されます。OTHERWISE 句が指定されていない場合は、WHEN に一致する値がないと、ERROR 条件が発生します。

注:

OTHERWISE は OTHER と略記できます。

アクションが実行された後、指定されたアクションによって通常のフローが変更されない限り、SELEC Tグループに続く最初の実行可能文に制御が移ります。

select-expression が省略されている場合は、それぞれの WHEN 句の式が評価され、必要に応じてビット文字列に変換されます。結果のビット文字列のいずれかのビットが '1'B であれば、WHEN 句の後の action が実行されます。

SELECT グループに WHEN 句がない場合は、OTHERWISE 句の action が無条件に実行されます。OTHERWISE 句を省略した場合、SELECT グループの実行でいずれの WHEN 句も選択されないと、ERROR 条件が発生します。

入れ子になった SELECT 文では、条件は上から下の順にチェックされます。真となる条件が 2 つある場合、最初の分岐のアクションだけが実行されます。

入れ子になった SELECT グループ内の各グループは END 文で閉じる必要があります。

SELECT;
   WHEN (9>B, C,D, FOUND) CALL PROC_1; 
   WHEN (A=B) CALL PROC_2;
   OTHERWISE CALL PROC_3;
END;

上記の例では、select-expression が省略されているため、それぞれの WHEN 句の式が評価されてビット文字列に変換されます。結果の文字列のいずれかのビットが 1 であれば、その WHEN 句の後のアクションが実行されます。

DECLARE MONTH CHAR(3),
      YEAR PIC'99',
      NO_DAYS FIXED BINARY;
.
.
.
SELECT(MONTH);
   WHEN ('FEB')
      SELECT (MOD(YEAR,4));
            WHEN (0) NO_DAYS = 29;
            OTHERWISE NO_DAYS = 28;
      END;
   WHEN ('APR','JUN','SEPT','NOV') NO_DAYS = 30; 
   OTHERWISE NO_DAYS = 31;
END;

上記の例は、変数を指定された月の日数に設定する入れ子になった SELECT グループを示しています。この例の MOD 組み込み関数は、YEAR を 4 で除算した余りを返します(このアルゴリズムは一部の世紀の年については正しくありません)。

制約事項

なし。