mysql存储函数case语句

mysql存储函数case语句,mysql,stored-functions,Mysql,Stored Functions,我正在构建一个存储函数,用于从浮点返回有效数字。。例如,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 ))))

我正在构建一个存储函数,用于从浮点返回有效数字。。例如,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

这是我第一次编写这样一个beast,不知道从哪里开始。

您可以将SQLs
CASE
用作单个表达式,返回单个值。它不像过程语言中的
IF
switch/case
那样使用(尽管您可以)。它更实用。因此,您可能需要:

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
语句。看。OPs代码非常好,除了缺少一个
在一行末尾。谢谢@Nick-你说得对。但同时,从技术上讲,我之前写的并没有错:“在SQL中…”对于纯SQL来说,这是真的:-)我仍然更改了文本并链接了“CASE语句”。是的,我应该明确指出这是MySQL特性。您出现语法错误的原因是您缺少一个
回程结束时(n,sf楼层(LOG10(ABS(n)))
谢谢:)