我的 MySQL CASE/WHEN 语法有啥问题?

Posted

技术标签:

【中文标题】我的 MySQL CASE/WHEN 语法有啥问题?【英文标题】:What is wrong with my MySQL CASE/WHEN syntax?我的 MySQL CASE/WHEN 语法有什么问题? 【发布时间】:2012-08-21 10:14:55 【问题描述】:

我正在尝试学习一些新的 mysql 语法,但遇到了麻烦。这应该很简单...

我在这里按照手册进行操作: http://dev.mysql.com/doc/refman/5.5/en/case.html

但我不断收到语法错误。这是我的日常:

# Drop anonymous accounts, if any
USE mysql;
CASE (SELECT COUNT(*) FROM user WHERE User = '' AND Host = 'localhost') 
 WHEN 1 THEN
  DROP USER ''@'localhost';
  FLUSH PRIVILEGES; 
END CASE;

错误是:

ERROR 1064 (42000):您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 'CASE (SELECT COUNT(*) FROM user WHERE User = '' 附近使用的语法 AND 主机 = 'localhost')

提前致谢。

【问题讨论】:

【参考方案1】:

在查看了您对固定语句但立即第二个问题的评论后,很明显您没有在存储过程或函数中使用它。 flow control statements 的文档非常巧妙地指出它们需要在存储过程/函数中。

将您的代码更新到一个过程中,然后调用该过程来执行:

USE mysql;

DROP PROCEDURE p;
DELIMITER |
CREATE PROCEDURE p() BEGIN
    CASE (SELECT COUNT(*) FROM user WHERE User = '' AND Host = 'localhost') 
        WHEN 1 THEN
            DROP USER ''@'localhost';
            FLUSH PRIVILEGES;
        ELSE
            SELECT 'no users found!';
    END CASE;
END;
|

CALL p();

还请注意,我添加了一个包罗万象的ELSE 块;如果您没有捕捉到该值,CASE 将抛出“未找到案例”警告 - 这可能是可取的,也可能不是可取的。

【讨论】:

好的,你的 CASE/WHEN 语法工作了!现在 DROP USER ''@'localhost';抛出语法错误?这应该很简单...? @AdamFriedman 啊 - 我现在看到了真正的问题,这是一个完全不同的问题,这实际上意味着您原来的 CASE-statement 是正确的。您没有在过程或函数中使用CASE - 这是一项要求。我会更新我的答案以反映。 您的解决方案有效。我去了兔子洞。现在我必须了解存储过程。非常感谢你把我带到这里——我想。 ;)

以上是关于我的 MySQL CASE/WHEN 语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

UPDATE + CASE WHEN + EXISTS + SELECT MAX 的 MySQL 语法

在MYSQL查询中使用CASE…WHEN语法重新映射值

MySQL中Case When用法

MySQL 条件, case when 和 if 方法

MYSQL case when 的两种用法

jooq中的Case When语法表达式