The world's most popular open source database
CASEcase_valueWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list] ... [ELSEstatement_list] END CASE
Or:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
The CASE statement for stored programs
implements a complex conditional construct. If a
search_condition evaluates to true,
the corresponding SQL statement list is executed. If no search
condition matches, the statement list in the
ELSE clause is executed. Each
statement_list consists of one or
more statements.
If no when_value or
search_condition matches the value
tested and the CASE statement contains no
ELSE clause, a Case not found for
CASE statement error results.
Each statement_list consists of one
or more statements; an empty
statement_list is not allowed. To
handle situations where no value is matched by any
WHEN clause, use an ELSE
containing an empty BEGIN ... END block, as
shown in this example:
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;
|
(The indentation used here in the ELSE clause
is for purposes of clarity only, and is not otherwise
significant.)
The syntax of the CASE
statement used inside stored programs
differs slightly from that of the SQL CASE
expression described in
Section 11.3, “Control Flow Functions”. The
CASE statement cannot have an ELSE
NULL clause, and it is terminated with END
CASE instead of END.


User Comments
Note the handling of NULL values:
CASE
WHEN var IS NULL THEN SELECT 'Hello';
ELSE SELECT 'world.';
END CASE;
CASE var
WHEN NULL THEN SELECT 'Hello';
ELSE SELECT 'world.';
END CASE;
This will not output "Hello Hello" as might be expected, but will instead output "Hello world." because, in the second CASE statement, "var = NULL" is not true (see http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html for explanation of that).
If you have problems updating using a case statement in 5.0 and it works in 5.1, use a subquery.
I was getting this #1366 - Incorrect decimal value: '' for column '' at row -1, and re-wrote the update to use a subquery and it worked.
UPDATE <Table_To_Update> AS v,
(SELECT key,
CASE CAST( some_column AS DECIMAL )
WHEN 0
THEN column_a + column_b
ELSE CAST( some_column AS DECIMAL )
END AS Result
FROM <Table_To_Update> ) AS vt
SET v.FieldToUpdate = vt.Result
WHERE v.key= vt.key
(updating column attribs did not matter, null, not null, decimal or as varchar) The regular update using a case statement works fine in 5.1, but I can't upgrade my prod serve for now.
Add your own comment.