Mysql 在Update 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(

我使用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(' ',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;