mysql 存储函数 case 语句

mysql stored function case statement

我正在构建一个存储函数来 return 来自浮点数的有效数字。例如 sfround(4.867,2) 将 return 4.8,sfround(1345,2) 将 return1300

示例代码为

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

这是我第一次写这么牛的东西,不知道从哪里开始..

您可以将 SQL CASE 用作单个表达式,其中 returns 是单个值。它在过程语言中不像 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;

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