CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
または:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
ストアドプログラムの CASE
ステートメントは、複雑な条件構造構文を実装します。
ここで説明する CASE
statement とは異なる CASE
operator もあります。 セクション12.5「フロー制御関数」を参照してください。 CASE
ステートメントは ELSE NULL
句を持つことができず、END
でなく、END CASE
で終了します。
最初の構文の場合、case_value
は式です。 この値は、各 WHEN
句内の when_value
式のいずれかに等しくなるまで、それらの式と比較されます。 等しい when_value
が見つかると、対応する THEN
句の statement_list
が実行されます。 どの when_value
も等しくない場合は、ELSE
句の statement_list
が実行されます (この句が存在する場合)。
NULL = NULL
は false であるため、この構文を NULL
と等しいかどうかのテストに使用することはできません。 セクション3.3.4.6「NULL 値の操作」を参照してください。
2 番目の構文の場合、各 WHEN
句の search_condition
式のいずれかが true になるまでそれらの式が評価され、いずれかが true になった時点で、それに対応する THEN
句の statement_list
が実行されます。 どの search_condition
も等しくない場合は、ELSE
句の statement_list
が実行されます (この句が存在する場合)。
どの when_value
も search_condition
もテストされた値に一致せず、かつ CASE
ステートメントに ELSE
句が含まれていない場合は、Case not found for CASE statementエラーになります。
各 statement_list
は、1 つ以上の SQL ステートメントで構成されます。空の statement_list
は許可されません。
どの WHEN
句でも値が一致しない状況を処理するには、次の例に示すように、空の BEGIN ... END
ブロックを含む ELSE
を使用します。 (ここの ELSE
句で使用されているインデントは透明性のみを目的にしており、それ以外の意味はありません。)
DELIMITER |
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE v
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
END;
|