【问题标题】:MySQL Case Select not behaving as expectedMySQL Case Select 未按预期运行
【发布时间】:2014-06-19 00:49:10
【问题描述】:

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

【问题讨论】:

    标签: mysql stored-procedures case modulo


    【解决方案1】:

    您正在混合使用CASE 的两种方式。你要么写:

    CASE
        WHEN <expression1> THEN <result1>;
        WHEN <expression2> THEN <result2>;
        ...
    END CASE
    

    这会评估每个表达式,并为第一个正确的表达式执行相应的结果。或者:

    CASE <expression>
        WHEN <val1> THEN <result1>;
        WHEN <val2> THEN <result2>;
        ...
    END CASE
    

    这会将&lt;expression&gt; 与每个值进行比较,并对第一个匹配的值执行相应的结果。

    您使用了第二种语法,但您的值也包含比较。所以他们要么是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;
    

    【讨论】:

      【解决方案2】:

      不应该更像

      CREATE PROCEDURE `AddPlants` (IN plantNum int)
      

      开始 声明计数 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;
      

      结束//

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        相关资源
        最近更新 更多