Использование переменной в хранимой процедуре обновления регистра - PullRequest
0 голосов
/ 16 марта 2020

Я использую оператор 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) : Синтаксическая ошибка рядом с 'ОБНОВЛЕНИЕ table_name SET SETMMonth = CASE WHEN @var_col' в строке 3

SET @var_column_name = TRIM(SUBSTRING(SUBSTRING_INDEX(line, ' ',2), LOCATE(' ',line)))

UPDATE table_name
SET column_name = 
CASE
    WHEN @var_column_name = 'Jan' THEN 01
    WHEN @var_column_name = 'Feb' THEN 02    
    WHEN @var_column_name = 'Mar' THEN 03
    etc ...
END
WHERE column_name IS NULL

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Предполагая, что у вас есть первичный ключ, вы можете определить значение в подзапросе и использовать:

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;
0 голосов
/ 16 марта 2020
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;
;;
...