MySQL сохраненная функция case - PullRequest
0 голосов
/ 07 февраля 2019

Я создаю хранимую функцию для возврата значащих цифр из числа с плавающей запятой. Например, 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

Я впервые пишу такого зверя и не имеюИдея с чего начать ..

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете использовать SQL CASE в качестве одного выражения, которое возвращает одно значение.Он не используется как IF или switch/case в процедурных языках (хотя вы можете сделать это тоже ).Это более функциональный стиль.Поэтому вам может понадобиться:

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;

Также обратите внимание, что я рассматриваю только синтаксическую ошибку.Не используемый алгоритм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...