MySQL 8.0 リファレンスマニュアル


13.6.5.1 CASE ステートメント

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_valuesearch_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;
  |

関連キーワード:  ステートメント, CREATE, TABLE, DROP, list, サブクエリー, FUNCTION, SLAVE, 関数, WHEN