gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:32:42 28 4
gpt4 key购买 nike

我可能遗漏了一些非常非常简单的东西,但我终其一生都无法弄清楚我做错了什么......

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

嵌套的 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 语句导致 award 的所有行的值都为“小于 1 小时” , 除了 total_hours 等于 1.00 的那些,其中 award 的值等于“青铜”。

按照上面的示例,嵌套的 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 语句,就像测试一样; WHEN total_hours > 1 THEN 'GT 1' ELSE 'LT 1' END award , 所有仍以 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 为何不起作用的知识吗?

提前致谢。 :)

最佳答案

你很接近,但有一些语法错误。改为这样做:

CASE 
WHEN total_hours >= 1 AND total_hours <= 50 THEN
'Bronze'
WHEN total_hours >= 51 AND total_hours <= 125 THEN
'Silver'
WHEN total_hours >= 126 AND total_hours <= 249 THEN
'Gold'
WHEN total_hours >= 250 THEN
'Platinum'
ELSE
'Less than 1 hour'
END AS award

Sample simplified SQL Fiddle

关于值范围的 MySQL CASE 不起作用,但嵌套的 IF 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965729/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com