MySQL CASE WHEN 混合 [compare_value] 和 [condition] 在 WHEN block 中不起作用

标签 mysql sql

Could someone please explain why this doesn't work as expected. And how to implement properly this logic on MySQL database? Example below:

create table test( effort text );
      insert into test values('0.1');
      insert into test values('0.25');
      insert into test values('1.5');
      insert into test values('5');
      insert into test values('10');

Sql

select effort, CASE effort 
    WHEN 0.1 THEN 5
    WHEN 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

结果:

enter image description here

最佳答案

您不能混合使用两种类型的 case 语句——简单语句和搜索语句。因此,为每个条件添加条件:

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;

您会注意到我将类型切换为字符串比较的相等性。您正在将 effort 存储为字符串,因此比较应该作为字符串或使用显式比较。

我建议您将该值存储为 DECIMAL(5, 2) 而不是字符串。那么case会写成:

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

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

关于MySQL CASE WHEN 混合 [compare_value] 和 [condition] 在 WHEN block 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43397263/

相关文章:

mysql返回每个字段列计数值的行

sql - 如何使用 GROUP BY 连接 MySQL 中的字符串?

java - 删除jtable中选定行时如何编写sql查询?

sql - "join table"是 SQL JOIN 的结果,还是多对多之间的表

sql - 如何跳过插入 db2 中的错误行?

mysql - 每个created_by的不同created_by和总和total_amount

html - 是否可以转义 & ' 存在于数据库中?

sql - 标量子查询包含多于一行

MySQL 为具有相同字符串的 CRC32() 返回不同的值

mysql - 在 Ubuntu 16.04 上重新安装 MySQL 5.7 服务器的问题