数据库
首页 > 数据库> > MySQL CASE的值范围不起作用,但嵌套的IF呢?

MySQL CASE的值范围不起作用,但嵌套的IF呢?

作者:互联网

我可能错过了一些非常非常简单的东西,但我不能为我的生活找出我做得不正确的事情……

我有这个查询,用于拉出人们在志愿服务中完成的时间,然后根据提交的小时数为他们分配奖励.不难…

嵌套的IF解决方案是可怕的,只是一个后退,看看它是否只是陷入困境的CASE.事实证明,janky嵌套的IF解决方案完美无缺,因为我的CASE解决方案仍然存在问题.

该查询每年仅运行一次以获得最终结果,因此性能不是真正的问题(嵌套的IF查询当前具有0.0095秒/ 700行的执行时间,这是完全足够的),更多的是它的事实彻底烦恼我,它没有工作,想要了解为什么将来参考.

作为参考,小时值存储为DECIMAL(8,2),随后total_hours的值也是相同的类型.

我正在寻找的输出是:

| id | first_name | last_name  | total_hours | award    |
|----|------------|------------|-------------|----------|
| 1  | Bob        | Harrington | 0.50        | Silver   |
| 2  | Jim        | Halpert    | 800.00      | Platinum |
| 3  | Dwight     | Shrute     | 130.00      | Gold     |
| 4  | Michael    | Scott      | 5.00        | Bronze   |

CASE语句导致所有行的奖励值都小于“小于1小时”,除了那些total_hours等于1.00的行,其中award的值等于’Bronze’.

嵌套的IF语句导致表正确生成,如上例所示.

这是我当前的CASE查询,但不起作用:

SELECT
    m.id,
    m.first_name,
    m.last_name,
    total_hours,
    CASE total_hours
        WHEN total_hours >= 1 <= 50 THEN
            'Bronze'
        WHEN total_hours >= 51 <= 125 THEN
            'Silver'
        WHEN total_hours >= 126 <= 249 THEN
            'Gold'
        WHEN total_hours >= 250 THEN
            'Platinum'
        ELSE
            'Less than 1 hour'
    END AS award
FROM (
    SELECT member_id, sum(hours) total_hours
    FROM volunteering_hours
    WHERE authorise_date > 0 AND validate_date > 0 AND delete_date = 0
    GROUP BY member_id
) hour_query
LEFT JOIN members m ON m.id = member_id
ORDER BY total_hours DESC

到目前为止我尝试过的:

>将原始比较数值放在引号中.
>给出比较数值小数位.
>尝试使用CASE语句只进行一次比较,就像测试一样;当total_hours> 1那么’GT 1’ELSE’LT 1’END奖励,所有列在运行查询后仍然以LT 1出现 – 意味着它失败了.
>对CASE语句进行分组
>将每个范围比较的语法更改为total_hours> = 1&& total_hours< = 50等等.它仍然产生相同的失败结果
我目前的嵌套IF解决方案看起来很可怕,但至少是有效的,是:

SELECT
    m.id,
    m.first_name,
    m.last_name,
    total_hours,
    IF(total_hours >= 1 && total_hours <= 50, 'Bronze',
        IF(total_hours >= 51 && total_hours <= 125, 'Silver',
            IF(total_hours >= 126 && total_hours <= 249, 'Gold',
                IF(total_hours >= 250, 'Platinum', 'Less than 1 hour')
            )
        )
    ) award
FROM (
    SELECT member_id, sum(hours) total_hours
    FROM volunteering_hours
    WHERE authorise_date > 0 AND validate_date > 0 AND delete_date = 0
    GROUP BY member_id
) hour_query
LEFT JOIN members m ON m.id = member_id
ORDER BY total_hours DESC

有人可以告诉我一些CASE无法正常工作的知识吗?

提前致谢.

标签:mysql,case,range,syntax-error,nested-if
来源: https://codeday.me/bug/20190623/1274470.html