CASE ステートメントは、複雑な条件ステートメントを構築するために使用されます。
CASE ステートメントは、以下のように2種類の構文をサポートしています:
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 ステートメントは異なります。CASE ステートメントには ELSE NULL 句を含めることはできず、END CASE で終了します。
最初の構文では、case_value は式であり、それぞれの WHEN 句内の when_value 式と比較され、一致する結果が見つかるまで続けられます。when_value と等しい値が見つかると、対応する THEN 句内の statement_list ステートメントが実行されます。when_value と等しい値がない場合は、ELSE 句内の statement_list ステートメント(存在する場合)が実行されます。この構文は、NULL との等価性をテストするためには使用できません。これは、NULL=NULL が False であるためです。
2番目の構文では、各 WHEN 句の search_condition 式が評価され、そのうちのいずれかの式の結果が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 句を使用してください。
obclient> DELIMITER //
obclient> CREATE PROCEDURE proc()
BEGIN
DECLARE x INT DEFAULT 1;
CASE x
WHEN 2 THEN SELECT x;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
END //
Query OK, 0 rows affected