2015-09-25 2 views
1

Функция ниже всегда возвращает значение ELSE (которое равно 6), даже если сам запрос SELECT возвращает значение 30.00. В этом случае функция должна возвращать номер 4. Может ли кто-нибудь мне помочь?Функция MySQL не возвращает правильный результат

DELIMITER $$ 
CREATE FUNCTION znamka(id_testu INT, id_studenta INT) 
    RETURNS TINYINT 
BEGIN 
    DECLARE percenta FLOAT; 
    SET percenta= 
    (
     SELECT ROUND(tv.pocet_bodov/t.max_body*100, 2) 
     FROM test t JOIN test_vysledky tv ON (tv.fk_test=t.id_test) 
     WHERE tv.fk_test=id_testu AND tv.fk_student=id_studenta 
    ); 
    RETURN CASE 
     WHEN percenta>=90 THEN 1 
     WHEN percenta<90 >=75 THEN 2 
     WHEN percenta<75 >=50 THEN 3 
     WHEN percenta<50 >=30 THEN 4 
     WHEN percenta<30 THEN 5 
     ELSE 6 
    END; 
END; 
$$ 
DELIMITER ; 
+3

«КОГДА Percenta <90 > = 75 THEN 2» и т.д. неверен синтаксис. Попробуйте «КОГДА процентов от 75 до 89.9999 THEN 2» и т. Д. Или «КОГДА процентов <90 и процентов> = 75 ТОГДА 2». – jarlh

+0

введите float в int и затем проверьте. –

ответ

2

Изменить CASE заявление следующим образом:

RETURN CASE 
    WHEN percenta >= 90 THEN 1 
    WHEN (percenta < 90 AND percenta >=75) THEN 2 
    WHEN (percenta < 75 AND percenta >=50) THEN 3 
    WHEN (percenta < 50 AND percenta >=30) THEN 4 
    WHEN percenta < 30 THEN 5 
    ELSE 6 
END; 

Комментарии:

Как @Drew отметил в своем комментарии, вы никогда не ударилась ELSE состояние. Кроме того, я удивлен, что MySQL выполнял эту функцию вообще без ошибок.

+1

Тим на помощь. Жаль, что его ELSE не имеет никакого смысла – Drew

+0

все тот же результат (всегда 6). Дрю, правда, теперь это не имеет смысла, плохо верно, что позже – Lopfest

+1

Вы что, ваш запрос работает так, как ожидалось? Что произойдет, если вы производите код 'percenta = 90' в своей функции? Устраняется ли соответствующее состояние? –

0

Каков тип данных pocet_bodov и max_body? Если это INT, вы можете получить усеченный результат. Попробуйте умножить сначала:

SELECT ROUND(100*tv.pocet_bodov/t.max_body, 2) 

Редактировать: Предыдущий не может стать причиной проблемы в MySQL, потому что он не выполняет вычисления INTEGER.

Оператор SQL CASE не совпадает с C SWITCH; он останавливается на согласующего состоянии первый, нет необходимости использовать BETWEEN:

RETURN CASE 
    WHEN percenta >= 90 THEN 1 
    WHEN percenta >=75) THEN 2 
    WHEN percenta >=50) THEN 3 
    WHEN percenta >=30) THEN 4 
    WHEN percenta < 30 THEN 5 
    ELSE 6 -- this will only be returned for NULLs 
END; 
+0

эти столбцы являются TINYINT UNSIGNED. – Lopfest

Смежные вопросы