【问题标题】:Case statement in MYSQL, Case not found for?MYSQL中的Case语句,没有找到Case?
【发布时间】: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,还会报错吗?

标签: mysql sql database mysqli mysql-workbench


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果我将查询限制为40 returned records,为什么它会执行41st pass
  • 您是否完整阅读了我的回答?计算机需要知道何时停止,但在循环底部检查条件。
  • 好的,只有在插入 40 条记录后才将 done 设置为 1,因为它在插入后检查,它在第 41 次插入时进行检查。谢谢兄弟
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 2021-04-02
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多