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