以下函数始终返回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 ;
答案 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_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;