【问题标题】:MySQL function does not return correct resultMySQL函数不返回正确的结果
【发布时间】:2015-09-25 06:31:40
【问题描述】:

例如,即使 SELECT 查询本身返回值 30.00,以下函数也始终返回 ELSE 值(即 6)。在这种情况下,该函数应返回数字 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 ;

【问题讨论】:

  • "WHEN percenta=75 THEN 2" 等是无效的语法。尝试“WHEN percenta 在 75 和 89.9999 THEN 2 之间”等,或“WHEN percenta =75 THEN 2”。
  • 将浮点数转换为 int 然后检查。

标签: mysql sql function


【解决方案1】:

将您的 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 执行这个函数时没有任何错误。

【讨论】:

  • 蒂姆来救援。太糟糕了,他的 ELSE 没有意义
  • 确定您的查询按预期工作吗?如果在函数中硬编码percenta = 90 会发生什么?适当的条件会触发吗?
  • 我相信除了您的CASE 语句存在问题之外,您的查询中还有一些问题。
  • @Lopfest:尝试返回percenta而不是CASE来查看实际值
  • 我发现 INSERT 语句实际上存在问题,而不是函数。 INSERT INTO test_vysledky VALUES (10, 99, 9, znamka(10, 99)); 这将始终从函数中插入 ELSE 值。但是当我把它放在下面时,函数存储在变量中: SET @VAR=(SELECT znamka(10, 99));插入 test_vysledky 值(10、99、9、@VAR);然后它选择正确的 CASE。虽然这不适合我,因为每个 INSERT 中都会有不同的函数变量。有什么想法吗?
【解决方案2】:

pocet_bodovmax_body 列的数据类型是什么?如果它是 INT,您可能会得到截断的结果。先试试乘法:

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

编辑:Previous 不会导致 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;

【讨论】:

  • 这些列都是 TINYINT UNSIGNED。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多