Mysql 在Update Case存储过程中使用变量
我使用CASE语句作为更新过程的一部分,在过去,我只是在CASE语句的每一行上重复了测试查询,如下所示,这是成功的Mysql 在Update Case存储过程中使用变量,mysql,sql,case,Mysql,Sql,Case,我使用CASE语句作为更新过程的一部分,在过去,我只是在CASE语句的每一行上重复了测试查询,如下所示,这是成功的 UPDATE table_name SET column_name = CASE WHEN TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) = 'Jan' THEN 01 WHEN TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(
UPDATE table_name SET column_name =
CASE
WHEN TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) = 'Jan' THEN 01
WHEN TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) = 'Feb' THEN 02
WHEN TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) = 'Mar' THEN 03
etc...
END
WHERE column_name IS NULL
我希望避免CASE语句在每次未获得条件匹配后都必须处理测试查询。我运行此过程所针对的表可能非常大,因此我的目标是提高一点处理效率
我考虑每行运行一次测试查询,并将结果保存到变量中。然后,CASE语句检查该变量,并在获得匹配时相应地执行操作
当我运行下面的查询时,会收到一条错误消息
查询1064中的错误:第3行的@var\u col“更新表\u name SET logMonth=CASE”附近的语法错误
假设您有主键,则可以在子查询中定义值并使用:
UPDATE table_name t JOIN
(SELECT tt.*,
TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) as x
FROM table_name tt
) tt
ON tt.<primary key> = t.<primary key>
SET t.column_name = (CASE WHEN tt.x = 'JAN' THEN 01
WHEN tt.x = 'FEB' THEN 02
. . .
END)
WHERE column_name IS NULL;
这不起作用:查询1054中出错:“字段列表”中的未知列“行”。请阅读编辑。您可以执行此操作来创建过程,以便在每次需要计算时调用。只需替换别名tb、col和id,然后在需要执行时:调用Monthify;每一句话都必须终止——你们两个都不能。字段和行从何而来?这些参数是否传递给过程?
DROP PROCEDURE IF EXISTS Mothify;
DELIMITER ;;
CREATE PROCEDURE Mothify()
BEGIN
DECLARE tmp_id INT;
DECLARE tmp_val VARCHAR(200);
DECLARE curs CURSOR FOR SELECT id, TRIM(SUBSTRING(SUBSTRING_INDEX(field, ' ',2), LOCATE(' ',line))) FROM tb where col is null;
OPEN curs;
row_looping: LOOP
FETCH curs INTO tmp_id, tmp_val;
UPDATE tb
SET col =
CASE
WHEN tmp_val = 'Jan' THEN 01
WHEN tmp_val = 'Feb' THEN 02
WHEN tmp_val = 'Mar' THEN 03
#etc..
END
WHERE id = tmp_id;
END LOOP;
CLOSE curs;
END;
;;
UPDATE table_name t JOIN
(SELECT tt.*,
TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line))) as x
FROM table_name tt
) tt
ON tt.<primary key> = t.<primary key>
SET t.column_name = (CASE WHEN tt.x = 'JAN' THEN 01
WHEN tt.x = 'FEB' THEN 02
. . .
END)
WHERE column_name IS NULL;