While creating a more complex stored procedure in MySQL, I encountered a weird problem with my CASE statement. I have simplified my procedure to show the issue. I am selecting t
You're mixing the two ways to use CASE
. You either write:
CASE
WHEN <expression1> THEN <result1>;
WHEN <expression2> THEN <result2>;
...
END CASE
This evaluates each expression, and executes the corresponding result for the first true one. Or:
CASE <expression>
WHEN <val1> THEN <result1>;
WHEN <val2> THEN <result2>;
...
END CASE
This compares <expression>
to each value, and executes the corresponding result for the first one that matches.
You used the second syntax, but your values also contain a comparison. So they're all either 0
(for false
) or 1
(for true
), and that's what you're comparing modTemp
to. Change to:
CASE modTemp
WHEN 1 THEN
SELECT 1;
WHEN 2 THEN
SELECT 2;
WHEN 0 THEN
SELECT 3;
ELSE
SELECT CONCAT('Error: modTemp = ', modTemp);
END CASE;
Shouldn't it be more like
CREATE PROCEDURE `AddPlants` (IN plantNum int)
BEGIN DECLARE count int; DECLARE modTemp int;
SET count = 1;
WHILE count <= plantNum DO
SELECT CONCAT('count = ', count);
SET modTemp = count % 3;
SELECT CONCAT('modTemp = ', modTemp);
CASE modTemp
WHEN 1 THEN
SELECT 1;
WHEN 2 THEN
SELECT 2;
WHEN 0 THEN
SELECT 3;
ELSE
SELECT CONCAT('Error: modTemp = ', modTemp);
END CASE;
SET count = count + 1;
END WHILE;
END//