mysql case select未按预期运行

8e2ybdfx  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(452)

在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。你知道这里发生了什么吗?

wmvff8tz

wmvff8tz1#

你把这两种使用方法混为一谈 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;
ccrfmcuu

ccrfmcuu2#

是不是应该更像

CREATE PROCEDURE `AddPlants` (IN plantNum int)

开始声明count int;声明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;

结束//

相关问题