gpt4 book ai didi

MySQL Case Select 未按预期运行

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:48 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/24297146/

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