【问题标题】:MySQL - Stored Procedure - Using a Case Expression inside Case Statement?MySQL - 存储过程 - 在案例语句中使用案例表达式?
【发布时间】:2016-12-23 02:03:08
【问题描述】:

我目前正在编写一个使用 case 语句来确定要运行哪些查询的存储过程。在我的一个查询中是一个 case 表达式,每次尝试保存更改后的过程时都会出现语法错误。如果没有那个 case 表达式,该过程将很好地保存,但一旦添加它就会失败。我知道表达式本身的语法是准确的,所以我想知道 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 表达式?如果是这样,它的格式是否不同?我怎样才能让它工作...?

谢谢!

【问题讨论】:

  • 您可以随意嵌套 case 语句,但请认真考虑反对它,因为这几乎是意大利面条逻辑的定义。
  • 无论您尝试做什么,这都可能成为您系统的不良先例
  • 我们正在自动生成某个报告。根据过程中输入的模板,使用不同的查询选择。语法有什么问题吗?如果允许将表达式放在语句中,为什么会说我有语法错误?

标签: mysql stored-procedures case-statement case-expression


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据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 ;
    

    【讨论】:

    • 嗯,很有趣。你知道为什么我的程序会抛出语法错误吗?它无法为我编译。也许是编辑器本身。
    • 找到了!!这是我的分隔符仍然设置为分号。一旦我将其更改为 $$ 就像您所做的那样,它就可以完美运行。谢谢!
    • 太好了,现在你可以关闭这个问题了...问候:)
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2011-09-26
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多