Я создаю хранимую функцию для возврата значащих цифр из числа с плавающей запятой. Например, 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
Я впервые пишу такого зверя и понятия не имею, с чего начать..
Вы можете использовать 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;
Также обратите внимание, что я обращаюсь только к синтаксической ошибке. Не используемый алгоритм.
CASE
специально для хранимых функций. Смотрите руководство . Код OPs прекрасно, кроме отсутствующего ;
в конце одной строки.
Есть некоторые проблемы с синтаксисом. Вы можете использовать следующую CREATE FUNCTION
:
DELIMITER //
CREATE FUNCTION sfround(n FLOAT, sf INT) RETURNS FLOAT DETERMINISTIC
BEGIN
IF n = 0 THEN
RETURN 0;
ELSE
RETURN ROUND(n ,sf-FLOOR(LOG10(ABS(n ))));
END IF;
END //
DELIMITER ;
;
в концеRETURN ROUND(n ,sf-FLOOR(LOG10(ABS(n ))))