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 是单个值。它在过程语言中不像 IF
或 switch/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;
另请注意,我只解决了语法错误。不是使用的算法。
我正在构建一个存储函数来 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 是单个值。它在过程语言中不像 IF
或 switch/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;
另请注意,我只解决了语法错误。不是使用的算法。