2016-08-16 99 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

这是我的分隔符。如果我将通用过程的分隔符更改为分号以外的内容,并最终将其更改回来,则一切正常。