mysql存储函数case语句

Posted

技术标签:

【中文标题】mysql存储函数case语句【英文标题】:mysql stored function case statement 【发布时间】:2019-02-07 11:15:17 【问题描述】:

我正在构建一个存储函数以从浮点数中返回有效数字。例如 sfround(4.867,2) 将返回 4.8,sfround(1345,2) 将返回 1300

示例代码是

delimiter //

CREATE FUNCTION sfround(n FLOAT, sf INT) RETURNS FLOAT DETERMINISTIC
BEGIN
CASE n
WHEN 0 THEN RETURN 0;
ELSE
BEGIN
RETURN ROUND(n ,sf-FLOOR(LOG10(ABS(n ))))
END;
END CASE;
END//

delimiter ;

(我知道缩进会导致mysql出现问题)

我抛出一个错误

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END;
END CASE;
END' at line 8

这是我第一次写这样的野兽,不知道从哪里开始..

【问题讨论】:

出现语法错误的原因是您在RETURN ROUND(n ,sf-FLOOR(LOG10(ABS(n )))) 末尾缺少; 谢谢 :) 【参考方案1】:

您可以将 SQL CASE 用作单个表达式,该表达式返回单个值。它不像IFswitch/case 在程序语言中使用(尽管您可以do that too)。它是更实用的风格。所以你可能需要的是:

delimiter //

CREATE FUNCTION sfround(n FLOAT, sf INT) RETURNS FLOAT DETERMINISTIC
BEGIN
  RETURN CASE n
    WHEN 0 THEN 0
    ELSE ROUND(n ,sf-FLOOR(LOG10(ABS(n ))))
  END;
END//

delimiter ;

请注意,对于单语句过程或函数,您不需要更改分隔符。也可能只是

CREATE FUNCTION sfround(n FLOAT, sf INT) RETURNS FLOAT DETERMINISTIC
  RETURN CASE n
    WHEN 0 THEN 0
    ELSE ROUND(n ,sf-FLOOR(LOG10(ABS(n ))))
  END;

另外请注意,我只解决语法错误。不是使用的算法。

【讨论】:

不是正确的,有一个专门针对存储函数的CASE 语句。请参阅manual。除了在一行末尾缺少; 之外,OP 代码非常好。 谢谢@Nick - 你是对的。但与此同时,我之前写的内容在技术上并没有错:“在 SQL ...” - 对于纯 SQL,这是真的 :-) 我仍然更改了文本并链接了“CASE 声明”。 是的,我应该明确指出它是 MySQL 的一项功能

以上是关于mysql存储函数case语句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库编程02

MySQL-07-笔记

mysql事务触发器视图存储过程函数

MySQL 存储过程CASE语句用法

case when用法

MySQL中的存储过程