值范围的MySQL案例不';如果';我们怎么办?
我可能错过了一些非常非常简单的事情,但我一辈子都搞不清楚我做得不对的是什么 我有一个查询,用于提取人们在志愿工作中完成的小时数,然后根据提交的小时数为他们分配奖励。不难 嵌套的IF解决方案非常糟糕,只是一种回退,以查看是否正是这个案例造成了混乱。结果是,janky嵌套的IF解决方案工作得很好,而我的案例解决方案仍然是失败的 查询每年只运行一次以获得最终结果,因此性能不是真正的问题(嵌套的IF查询当前的执行时间为0.0095秒/700行,这是完全足够的),更重要的是,它完全让我恼火,因为它不起作用,并且希望了解原因以供将来参考 作为参考,小时值存储为十进制(8,2),随后总小时值也是相同类型 我想要的输出是:值范围的MySQL案例不';如果';我们怎么办?,mysql,syntax-error,range,case,nested-if,Mysql,Syntax Error,Range,Case,Nested If,我可能错过了一些非常非常简单的事情,但我一辈子都搞不清楚我做得不对的是什么 我有一个查询,用于提取人们在志愿工作中完成的小时数,然后根据提交的小时数为他们分配奖励。不难 嵌套的IF解决方案非常糟糕,只是一种回退,以查看是否正是这个案例造成了混乱。结果是,janky嵌套的IF解决方案工作得很好,而我的案例解决方案仍然是失败的 查询每年只运行一次以获得最终结果,因此性能不是真正的问题(嵌套的IF查询当前的执行时间为0.0095秒/700行,这是完全足够的),更重要的是,它完全让我恼火,因为它不起作用
| 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 |
案例陈述的结果是,对于奖励
,所有行的值均小于1小时,但总小时数等于1.00的行除外,其中奖励
的值等于“青铜”
嵌套的IF语句导致正确生成表,如上面的示例所示
这是我当前的案例查询,但不起作用:
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
有人能告诉我为什么这个案子不起作用吗
提前感谢。:) 试试下面的方法
SELECT
m.id,
m.first_name,
m.last_name,
total_hours,
CASE WHEN total_hours between 1 and 50 THEN
'Bronze'
WHEN total_hours between 51 and 125 THEN
'Silver'
WHEN total_hours between 126 and 249 THEN
'Gold'
WHEN total_hours between 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
我不确定你是否可以在你的案例陈述中使用between,但我认为你可以。如果不能,则只需将其正确分解,如
total_hours>=1和total_hours,您很接近,但有一些语法错误。改为这样做:
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
案例
当总时数>=1,总时数=51,总时数=126,总时数=250时,则
“白金”
其他的
“不到1小时”
以奖励结束
您混合了(不同的)大小写语法
如果您使用的是case xx
,则您的WHEN不应再次包含xx
:
case xx
when 1 then statement
when 2 then statement
如果仅使用案例
,则需要提供要比较的变量:
case
when xx=1 then statement
when xx=2 then statement
请参见此处的示例:
与编程语言相比,第一种语言等于
switch(variable){
case 1: statement; break;
case 2: statement; break;
}
而第二个是
if (variable==1){
statement;
else if (variable==2){
statement;
}
谢谢这是完美的,尽管@dognose解释了原因,这很有帮助。所以我不确定该把哪一个标记为答案,不必怀疑你,这确实有帮助!为此,我非常感激@奥辛很乐意帮忙!选择您认为最好的答案并提供解决方案。谢谢!:)虽然我不确定是否要将您或@jpw的答案标记为答案,因为他们两人都很有帮助!:)
switch(variable){
case 1: statement; break;
case 2: statement; break;
}
if (variable==1){
statement;
else if (variable==2){
statement;
}