MySQL сохраненная функция case

0

Я создаю хранимую функцию для возврата значащих цифр из числа с плавающей запятой. Например, 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
    Причина, по которой у вас есть синтаксическая ошибка, заключается в том, что вам не хватает a ; в конце RETURN ROUND(n ,sf-FLOOR(LOG10(ABS(n ))))
  • 0
    <facepalm> спасибо :)
Теги:
stored-functions

2 ответа

1

Вы можете использовать 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;

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

  • 0
    Это не так, есть оператор CASE специально для хранимых функций. Смотрите руководство . Код OPs прекрасно, кроме отсутствующего ; в конце одной строки.
  • 0
    Спасибо @Nick - Ты прав. Но в то же время это не было технически неправильно, что я написал ранее: «В SQL ...» - для чистого SQL это правда :-) Я все еще изменил текст и связал «CASE Statement ».
Показать ещё 1 комментарий
0

Есть некоторые проблемы с синтаксисом. Вы можете использовать следующую 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 ;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню