在MySQL中创建一个更复杂的存储过程时,我的CASE语句遇到了一个奇怪的问题。我简化了我的程序以显示问题。我在每个循环中选择三个内容来澄清问题:count
变量,CASE之前的modTemp
变量,然后是表示采用CASE路径的数字。
DELIMITER //
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 modTemp = 1 THEN
SELECT 1;
WHEN modTemp = 2 THEN
SELECT 2;
WHEN modTemp = 0 THEN
SELECT 3;
ELSE
SELECT CONCAT('Error: modTemp = ', modTemp);
END CASE;
SET count = count + 1;
END WHILE;
END//
现在我使用CALL AddPlants(3);
以下是我的结果:
预期输出
count = 1,modTemp = 1,1
count = 2,modTemp = 2,2
count = 3,modTemp = 0,3
实际输出
count = 1,modTemp = 1,1
count = 2,modTemp = 2,错误:modTemp = 2
count = 3,modTemp = 0,1
每次,count和modTemp都是正确的值。但是,在第二个循环中,modTemp为2但不输入CASE 2.在第三个循环中,modTemp为0但进入CASE 1.任何想法在这里发生了什么?
答案 0 :(得分:3)
您正在使用两种方式混合使用CASE
。你要么写:
CASE
WHEN <expression1> THEN <result1>;
WHEN <expression2> THEN <result2>;
...
END CASE
这将计算每个表达式,并为第一个表达式执行相应的结果。或者:
CASE <expression>
WHEN <val1> THEN <result1>;
WHEN <val2> THEN <result2>;
...
END CASE
将<expression>
与每个值进行比较,并对匹配的第一个值执行相应的结果。
您使用了第二种语法,但您的值也包含比较。所以他们都是0
(对于false
)或1
(对于true
),这就是你要比较的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;
答案 1 :(得分:1)
不应该更像
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 //