SELECT CASE param_name END CASE INTO @var в хранимой процедуре с использованием параметров для назначения столбцов

0

У меня есть хранимая процедура, которую я пытаюсь создать с параметрами.

DELIMITER // 
    CREATE PROCEDURE insert_avg(IN area INT, IN checkid INT, IN legend INT)
this_proc: BEGIN

SELECT
    CASE legend
        WHEN 1 THEN "Input_Day"
        WHEN 2 THEN "Input_Week"
        WHEN 3 THEN "Input_Month"
        ELSE LEAVE this_proc
    END CASE;
INTO @LEGEND;

INSERT INTO 
    'input_teamboards' 
    (
        'Input_KPI', 
        'Input_Month', 
        'Input_Week',   
        'Input_Day', 
        'Input_Value', 
        'Input_Comparison', 
        'Input_Area', 
        'Input_Created'
     ) 
VALUES 
    (
        7,
        IFNULL(SELECT 'Input_Month' FROM 'input' WHERE 'check_id' = checkid, NULL, MONTH(NOW())),
        IFNULL(SELECT 'Input_Week' FROM 'input' WHERE 'check_id' = checkid, NULL, WEEKOFYEAR(NOW())),
        IFNULL(SELECT 'Input_Day' FROM 'input' WHERE 'check_id' = checkid, NULL, DAYOFYEAR(NOW())),
        (SELECT 
            AVG('Input_value') 
        FROM 
            'input' 
        WHERE 
            'Area_ID' = area AND @LEGEND = 1),
        2,
        area,
        NOW()
    )

END//
DELIMITER ;

Как вы можете видеть, переменная @LEGEND используется как часть подзапроса для имени столбца ниже.

У меня проблема с оператором case, он продолжает выдавать ошибки внутри оператора case:

"# 1064 - у вас есть ошибка в вашем синтаксисе SQL; проверьте правильность синтаксиса в руководстве, соответствующем вашей версии сервера MariaDB, рядом с" LEAVE this_proc END CASE; INTO @LEGEND; INSERT INTO input_teamboards "в строке 8"

Я использовал эти ссылки до сих пор, но застрял на том, что я делаю неправильно?

Mysql Сохранение переменной с результатом SELECT CASE
Mysql - Как выйти/выйти из хранимой процедуры
инструкция case в хранимой процедуре

Любая помощь приветствуется!

  • 0
    ОСТАВИТЬ колонку?
  • 0
    Нет, это не столбец, я имею в виду Input_Day , Input_Week и Input_Month
Показать ещё 4 комментария
Теги:
database

1 ответ

2
Лучший ответ

Я бы переписал твой процесс как этот. Смотрите ниже код для дальнейшего объяснения.

DELIMITER // 
CREATE PROCEDURE insert_avg(IN area INT, IN checkid INT, IN legend INT)
this_proc:BEGIN

IF legend NOT IN (1, 2, 3)
     LEAVE this_proc;
END IF;

INSERT INTO input_teamboards
(
    Input_KPI, 
    Input_Month, 
    Input_Week,   
    Input_Day, 
    Input_Value, 
    Input_Comparision, 
    Input_Area, 
    Input_Created
 ) 
SELECT
    7,
    COALESCE(Input_Month, MONTH(NOW())),
    COALESCE(Input_Week, WEEKOFYEAR(NOW())),
    COALESCE(Input_Day, DAYOFYEAR(NOW())),
    (SELECT AVG(Input_value) FROM input WHERE Area_ID = area AND
     ((legend = 1 AND Input_Day = 1)  OR
      (legend = 2 AND Input_Week = 1)  OR
      (legend = 3 AND Input_Month = 1))),
    2,
    area,
    NOW()
FROM input
WHERE check_id = checkid;

END//
DELIMITER ;

Основное изменение, которое я сделал здесь, - переписать ваш запрос вставки. Я перефразировал это как INSERT INTO... SELECT. Это должно работать, потому что большинство ваших подзапросов ссылались на одну и ту же таблицу input. Для среднего подзапроса я обработал логику с параметром legend, просто проверив его значение, а затем проверив соответствующий соответствующий столбец. Это позволяет нам удалить выражение CASE вы изначально имели в начале вашего процесса.

  • 1
    Условие IF legend < 1 OR legend > 3 должно быть legend not in (1,2,3) если legend имеет значение NULL.
  • 0
    Это намного проще, спасибо @TimBiegeleisen!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню