在mysql中创建更复杂的存储过程时,我遇到了case语句的一个奇怪问题。我简化了我的程序来说明这个问题。我在每个循环中选择三件事来澄清这个问题: count
变量 modTemp
变量,然后是一个数字,表示采用了哪个案例路径。
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);
以下是我的结果:
预期产量
计数=1,modtemp=1,1
计数=2,modtemp=2,2
计数=3,modtemp=0,3
实际产量
计数=1,modtemp=1,1
计数=2,modtemp=2,错误:modtemp=2
计数=3,modtemp=0,1
每次,count和modtemp都是正确的值。但是,在第二个循环中,modtemp是2,但不输入case2。在第三个循环中,modtemp是0,但是进入了案例1。你知道这里发生了什么吗?
2条答案
按热度按时间wmvff8tz1#
你把这两种使用方法混为一谈
CASE
. 你要么写:这将计算每个表达式,并为第一个真表达式执行相应的结果。或:
相比之下
<expression>
并为第一个匹配的值执行相应的结果。您使用了第二种语法,但是您的值也包含比较。所以他们都不是
0
(用于false
)或者1
(用于true
),这就是你要比较的modTemp
到。更改为:ccrfmcuu2#
是不是应该更像
开始声明count int;声明modtemp int;
结束//