MYSQL中的Case语句,没有找到Case?

Posted

技术标签:

【中文标题】MYSQL中的Case语句,没有找到Case?【英文标题】:Case statement in MYSQL, Case not found for? 【发布时间】:2013-04-13 17:52:41 【问题描述】:

我有一个 CASE 语句,它接收表的前 40 条记录,它具有基于计数器的不同过程 - @COUNT。 不幸的是,当我在没有else 的情况下运行该程序时,它不起作用并给出Case not found for CASE statement (Error 1339)

但是当我确实有 else 时,它​​工作正常,但它在最后一天运行了两次,所以我有最后一个日期的副本。

有什么理由吗?请检查我下面的代码..很多已被删除

CREATE PROCEDURE `init`(In dID INT)

BEGIN  
    DECLARE first40 CURSOR FOR 
                SELECT * FROM tbl
                WHERE tbl.id = dID
                ORDER BY tbl.datum ASC
                LIMIT 40;

    OPEN first40;

    SET @COUNT = 0;
REPEAT FETCH first40 INTO Tid, Tdt, Tcls, Thgh, Tlw, Tvol, Tnms_id;
    SET @COUNT = @COUNT + 1;
CASE 
WHEN @COUNT = 1 THEN 

WHEN @COUNT>= 2 AND @COUNT < 9 THEN 

WHEN @COUNT = 9 THEN 

WHEN @COUNT >= 10 AND @COUNT < 12 THEN 

WHEN @COUNT = 12 THEN

WHEN @COUNT = 13 THEN

WHEN @COUNT = 14 THEN

WHEN @COUNT = 15 THEN

WHEN @COUNT = 16 THEN

WHEN @COUNT >= 17 AND @COUNT < 20 THEN

WHEN @COUNT >= 20 AND @COUNT < 26 THEN

WHEN @COUNT = 26 THEN

WHEN @COUNT >= 27 AND @COUNT < 34 THEN 

WHEN @COUNT = 34 THEN 

WHEN @COUNT > 34 AND @COUNT <= 40 THEN 
    END CASE; 

INSERT INTO .....
            VALUES ....;

UNTIL done END REPEAT;

CLOSE first40; 

END

【问题讨论】:

如果你把else去掉,把limit改成limit 39,还会报错吗? 【参考方案1】:

您应该能够轻松地将ELSE 添加回 CASE(与 SELECT 查询不同,ELSE 在存储过程 CASE 块中是必需),然后在 INSERT INTO 之前跟进:

IF @COUNT <= 40
INSERT INTO .....
            VALUES ....;

重复第40行的原因是第41次通过REPEAT FETCH,没有得到任何数据所以

    变量未更新(但也未清除) 直到UNTIL done 部分之前的代码块之后才会检查条件。

【讨论】:

如果我将查询限制为40 returned records,为什么它会执行41st pass 您是否完整阅读了我的回答?计算机需要知道何时停止,但在循环底部检查条件。 好的,只有在插入 40 条记录后才将 done 设置为 1,因为它在插入后检查,它在第 41 次插入时进行检查。谢谢兄弟

以上是关于MYSQL中的Case语句,没有找到Case?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL: case when 用法

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

在switch中的case语句中声明变量会被提前

MySQL中的case语句

Mysql:分支结构—case结构

第四节课