【问题标题】:mysql stored function case statementmysql存储函数case语句
【发布时间】: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 )))) 末尾缺少;
  • 谢谢 :)

标签: mysql stored-functions


【解决方案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 的一项功能
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2021-04-02
  • 2012-06-21
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多