MySQL Case选择不按预期运行

时间:2014-06-19 00:49:11

标签: mysql stored-procedures case modulo

在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.任何想法在这里发生了什么?

2 个答案:

答案 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 //