MySQL函数没有返回正确的结果

时间:2015-09-25 06:31:41

标签: mysql sql function

以下函数始终返回ELSE值(即6),即使SELECT查询本身返回值30.00。在这种情况下,该功能应返回4号。任何人都可以帮助我吗?

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 ;

2 个答案:

答案 0 :(得分: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 :(得分:0)

这些pocet_bodovmax_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;