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 ))))
末尾缺少;
您可以将 SQL CASE
用作单个表达式,该表达式返回单个值。它不像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;
另外请注意,我只解决语法错误。不是使用的算法。
【讨论】:
这不是正确的,有一个专门针对存储函数的CASE
语句。请参阅manual。除了在一行末尾缺少;
之外,OP 代码非常好。
谢谢@Nick - 你是对的。但与此同时,我之前写的内容在技术上并没有错:“在 SQL ...” - 对于纯 SQL,这是真的 :-) 我仍然更改了文本并链接了“CASE 声明”。
是的,我应该明确指出它是 MySQL 的一项功能以上是关于mysql存储函数case语句的主要内容,如果未能解决你的问题,请参考以下文章