gpt4 book ai didi

MySQL Case Select 的行为不符合预期

转载 作者:行者123 更新时间:2023-11-29 18:02:51 25 4
gpt4 key购买 nike

在 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);这是我的结果:

<小时/>

预期输出

计数 = 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,但不进入 CASE 2。在第三个循环中,modTemp 为 0,但进入 CASE 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

这比较 <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;

关于MySQL Case Select 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com