MySQL存储过程CASE函数UPDATE语句语法错误排查求助
问题排查与修正方案
错误原因分析
- CASE表达式语法误用:你采用了
CASE 'offz'这类简单CASE格式,但后续WHEN子句是条件判断(如off_tz='EDT'),不符合简单CASE的语法规则(简单CASE要求WHEN后是与CASE后表达式匹配的单一值),需改用搜索式CASE表达式。 - UPDATE语句多余别名:UPDATE的SET子句中,给CASE结果添加
AS 'offz'属于无效语法,SET的格式为字段 = 计算值,不需要额外别名。 - 存储过程分隔符冲突:MySQL默认以分号
;作为语句结束符,存储过程内部的UPDATE语句已使用分号,会导致MySQL提前终止存储过程定义,进而触发END附近的语法错误,需临时修改分隔符。
修正后的存储过程代码
DELIMITER // CREATE PROCEDURE process_flight_log_staging_doug() BEGIN UPDATE `flight_log_staging_emt` SET `off_z` = CASE WHEN `off_tz`='EDT' THEN `off_lcl`+INTERVAL 4 HOUR WHEN `off_tz`='CDT' OR `off_tz`='EST' THEN `off_lcl`+INTERVAL 5 HOUR WHEN `off_tz`='MDT' OR `off_tz`='CST' THEN `off_lcl`+INTERVAL 6 HOUR WHEN `off_tz`='PDT' OR `off_tz`='MST' THEN `off_lcl`+INTERVAL 7 HOUR WHEN `off_tz`='PST' THEN `off_lcl`+INTERVAL 8 HOUR ELSE `off_z` END; UPDATE `flight_log_staging_emt` SET `on_z` = CASE WHEN `on_tz`='EDT' THEN `on_lcl`+INTERVAL 4 HOUR WHEN `on_tz`='CDT' OR `on_tz`='EST' THEN `on_lcl`+INTERVAL 5 HOUR WHEN `on_tz`='MDT' OR `on_tz`='CST' THEN `on_lcl`+INTERVAL 6 HOUR WHEN `on_tz`='PDT' OR `on_tz`='MST' THEN `on_lcl`+INTERVAL 7 HOUR WHEN `on_tz`='PST' THEN `on_lcl`+INTERVAL 8 HOUR ELSE `on_z` END; END // DELIMITER ;
关键修正点说明
- 移除CASE后的
'offz'和'onz'字符串,改用搜索式CASE,直接在WHEN后编写条件判断,符合MySQL语法规范。 - 删除UPDATE语句中CASE结尾的
AS 'offz'和AS 'onz',消除无效语法。 - 添加
DELIMITER //临时修改语句分隔符,避免存储过程内部的分号提前终止定义,最后恢复默认分隔符DELIMITER ;。
内容的提问来源于stack exchange,提问作者Brian Douglas
相关产品推荐
相关产品推荐

