2016-08-16 89 views
1

我目前正在編寫一個使用case語句來確定要運行的查詢的存儲過程。在我的其中一個查詢中是一個case表達式,每次我嘗試保存更改的過程時,都會收到語法錯誤。如果沒有這種情況表達式,該過程將會保存正常,但是一旦添加它就會失敗。我知道表達式本身的語法是準確的,所以我想知道case語句中是否允許使用case表達式。MySQL - 存儲過程 - 在Case語句中使用Case表達式?

實施例:

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你的代碼和它的作品,我改變的唯一事情就是tabletable1因爲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

這是我的分隔符。如果我將通用過程的分隔符更改爲分號以外的內容,並最終將其更改回來,則一切正常。