混合[compare_value]和[condition]时的MySQL情况在WHEN块中不起作用

混合[compare_value]和[condition]时的MySQL情况在WHEN块中不起作用,mysql,sql,Mysql,Sql,有人能解释一下为什么这不能像预期的那样起作用吗。如何在MySQL数据库上正确实现这种逻辑?示例如下: Sql 结果: 不能混合使用两种类型的case语句-simple和searched。因此,为每一个设置条件: select effort, (CASE WHEN effort = '0.1' THEN 5 WHEN effort = '0.25' THEN 4 WHEN CAST(effort AS DECIMAL(5,2)) &

有人能解释一下为什么这不能像预期的那样起作用吗。如何在MySQL数据库上正确实现这种逻辑?示例如下:

Sql

结果:


不能混合使用两种类型的case语句-simple和searched。因此,为每一个设置条件:

select effort,
       (CASE WHEN effort = '0.1' THEN 5
             WHEN effort = '0.25' THEN 4
             WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
             WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
             WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END) as ISE
from test;

我认为没有理由将值存储为字符串,如果它是数字的。

您不能混合使用两种类型的case语句-simple和searched。因此,为每一个设置条件:

select effort,
       (CASE WHEN effort = '0.1' THEN 5
             WHEN effort = '0.25' THEN 4
             WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
             WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
             WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END) as ISE
from test;
select effort,
       CASE WHEN effort = '0.1' THEN 5
            WHEN effort = '0.25' THEN 4
            WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
            WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
            WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END as ISE
from test;

我看不出有任何理由将值存储为字符串,如果它是数字的。

您编写了一个值大小写,将努力与值列表进行比较,mysql将CASTeffort视为十进制5,2<3,作为一个布尔表达式,其值可能为0或1。您编写了一个值大小写,将努力与值列表进行比较,mysql将CASTeffort视为十进制5,2<3的布尔表达式,其值可能为0或1。我不是模式所有者。只需为生成报告,所以它已经为该列定义了类型。我不是架构所有者。只需为生成报告,因此已为此列定义了类型。
select effort,
       CASE WHEN effort = '0.1' THEN 5
            WHEN effort = '0.25' THEN 4
            WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
            WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
            WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END as ISE
from test;
select effort,
       CASE WHEN effort = '0.1' THEN 5
            WHEN effort = '0.25' THEN 4
            WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
            WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
            WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END as ISE
from test;