MySQL存储函数的正确if子句语法是什么?

时间:2019-06-03 23:36:23

标签: mysql stored-functions sqlyog

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

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

为了解决这个问题,我希望将1到-1(不包括0)之间的数字截断为平凡的零的数量加上必要的无花果的数量。在下面的代码中,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;

我在这一行上仍然遇到相同的错误,这使我认为我在IF子句的MySQL语法中缺少一些简单的东西。

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 ;

如果有人对语法错误或更合理的方法来解决原始错误有任何建议,我将不胜感激!非常感谢!

1 个答案:

答案 0 :(得分:1)

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

  

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