2016-08-16 3 views
1

В настоящее время я пишу хранимую процедуру, которая использует операторы case для определения запросов. Внутри одного из моих запросов есть выражение case, и каждый раз, когда я пытаюсь сохранить измененную процедуру, я получаю синтаксическую ошибку. Эта процедура сохранит штраф без выражения этого случая, но сработает после ее добавления. Я знаю, что синтаксис самого выражения является точным, поэтому мне интересно, разрешены ли выражения case внутри оператора case.MySQL - Сохраненная процедура - использование выражения выражения внутри случая?

Пример:

CASE 
    WHEN x = 1 THEN 
     SELECT 
      5 AS 'Col1', 
      CASE 
       WHEN y = 5 THEN 2 
       ELSE 0 
      END AS 'Col2' 
     FROM table 
     WHERE 1=1 
     ; 
    WHEN x = 2 THEN 
     SELECT 
      * 
     FROM table2 
     ; 
    ELSE 
     SELECT 
      * 
     FROM table3 
     ; 
END CASE; 

Любая помощь будет высоко оценили. Возможно ли иметь выражение case внутри аргумента case? Если да, то форматируется ли оно иначе? Как я могу заставить это работать ...?

Спасибо!

+0

Вы можете вложить аргументы case столько, сколько хотите, но серьезно подумайте о ПРОТИВ этого, потому что это в значительной степени определение логики спагетти. –

+0

Независимо от того, что вы пытаетесь сделать, это может оказаться там как плохой прецедент для вашей системы. – Drew

+0

Мы автоматизируем определенный отчет. В зависимости от формы шаблона в процедуре используется другой выбор запроса. Что-то не так с синтаксисом? Если разрешено помещать выражения внутри операторов, почему бы сказать, что у меня синтаксическая ошибка? – WoofDg79

ответ

0

Согласно MySQL docs, вложенным CASE операторов поддерживаются, я попробовал ваш код в test_proc, и она работает, единственное, что я могу изменить это table к table1, потому что table является

delimiter $$ 
create procedure test_proc() 
begin 
    CASE 
     WHEN x = 1 THEN 
      SELECT 
       5 AS 'Col1', 
       CASE 
        WHEN y = 5 THEN 2 
        ELSE 0 
       END AS 'Col2' 
      FROM table1 
      WHERE 1=1; 
     WHEN x = 2 THEN 
      SELECT 
       * 
      FROM table2 
      ; 
     ELSE 
      SELECT 
       * 
      FROM table3 
      ; 
    END CASE; 
end $$ 
delimiter ; 
+0

Хммм очень интересно. У вас есть идеи, почему моя процедура будет вызывать синтаксическую ошибку? Он не скомпилируется для меня. Может быть, это сам редактор. – WoofDg79

+0

Нашел! Это был мой разделитель, который все еще настроен на полуточку. Как только я сменил его на $$, так как вы сделали это отлично. Спасибо! – WoofDg79

+0

Отлично, теперь вы можете закрыть этот вопрос ... привет :) –

0

Это был мой разделитель , Если я изменю разделитель для общей процедуры на что-то другое, кроме полуколонии, и сменим его в конце, все будет хорошо.

Смежные вопросы