【问题标题】:What is the proper if clause syntax for a MySQL stored function?MySQL 存储函数的正确 if 子句语法是什么?
【发布时间】:2019-10-19 12:03:46
【问题描述】:

我是 MySQL 的新手,所以如果其中一些相对初级,我深表歉意。

我正在尝试编写一个存储函数来将一个数字四舍五入到一定数量的有效数字。我有一个理论上应该可以工作的函数——我咨询了另一个有用的 StackOverflow 来确定逻辑(Round to n Significant Figures in SQL)。但是,1 到 -1 之间的数字(不包括 0,因为我在边缘情况下捕获)无法正确舍入;例如,调用sfround(.00123456789, 5),应该产生0.0012345,而不是产生0.0012345999712124467。

为了解决这个问题,我希望将 1 到 -1(不包括 0)之间的数字截断为平凡零的数量加上必要的 sig 无花果的数量。在下面的代码中,IF 子句旨在执行这种截断。但是,我发现每当我包含这个 IF 子句时,都会导致错误:

'错误代码:1064。你的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'DECLARE numDigits INT; 附近使用的正确语法; SET numDigits = FLOOR(LOG10(ABS(number))); #total d' 在第 5 行)。

即使我尝试了一个非常简单的 IF 语句,例如

IF (5 = 5) THEN DECLARE dummyvar INT; END IF;

我在这一行仍然遇到同样的错误,这让我认为我在 MySQL 的 IF 子句语法中遗漏了一些简单的东西。

DELIMITER $$

USE `vg_summary1`$$

DROP FUNCTION IF EXISTS `sfround`$$

CREATE FUNCTION 'sfround`(number FLOAT, sf INT) RETURNS FLOAT
DETERMINISTIC
BEGIN
     IF ((ABS(number) < 1) AND (ABS(number) > 0)) THEN            
        DECLARE numDigits INT;
        SET numDigits = FLOOR(LOG10(ABS(number)));     
        DECLARE trivialDigits INT;
        SET trivialDigits = 0;                         
                DECLARE placeholder FLOAT;
        SET placeholder = ABS(number);               

        WHILE placeholder < 1
        BEGIN
           placeholder = placeholder * 10;
           IF (placeholder < 1) THEN trivialDigits = trivialDigits + 1;    
           END IF;
        END;

        DECLARE keptDigits = trivialDigits + sf;

        DECLARE special_answer FLOAT;
        SET special_answer = ROUND(number, keptDigits-1-FLOOR(LOG10(ABS(number))));
        RETURN special_answer;

     END IF;

     DECLARE r FLOAT;

     SET r = CASE WHEN number = 0 THEN 0 ELSE ROUND(number, sf-1-FLOOR(LOG10(ABS(number)))) END;
     RETURN r;

   END$$

 DELIMITER ;

如果有人对语法错误或修复原始错误的更合乎逻辑的方法有任何建议,我将非常感激听到他们的意见!非常感谢!

【问题讨论】:

标签: mysql stored-functions sqlyog


【解决方案1】:

https://dev.mysql.com/doc/refman/8.0/en/declare.html

DECLARE 只允许在 BEGIN ... END 复合语句中使用,并且必须位于其开头,在任何其他语句之前。

【讨论】:

  • 非常感谢,这解决了问题!如果其他人有兴趣使用此解决方法来舍入到 sig figs,我修复了 DECLARE 语句和我的 while 循环中的另一个错误(我在输入条件后缺少“DO”),以使上述代码正常运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2012-09-17
  • 2011-01-24
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多