值范围的MySQL案例不';如果';我们怎么办?

值范围的MySQL案例不';如果';我们怎么办?,mysql,syntax-error,range,case,nested-if,Mysql,Syntax Error,Range,Case,Nested If,我可能错过了一些非常非常简单的事情,但我一辈子都搞不清楚我做得不对的是什么 我有一个查询,用于提取人们在志愿工作中完成的小时数,然后根据提交的小时数为他们分配奖励。不难 嵌套的IF解决方案非常糟糕,只是一种回退,以查看是否正是这个案例造成了混乱。结果是,janky嵌套的IF解决方案工作得很好,而我的案例解决方案仍然是失败的 查询每年只运行一次以获得最终结果,因此性能不是真正的问题(嵌套的IF查询当前的执行时间为0.0095秒/700行,这是完全足够的),更重要的是,它完全让我恼火,因为它不起作用

我可能错过了一些非常非常简单的事情,但我一辈子都搞不清楚我做得不对的是什么

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

嵌套的IF解决方案非常糟糕,只是一种回退,以查看是否正是这个案例造成了混乱。结果是,janky嵌套的IF解决方案工作得很好,而我的案例解决方案仍然是失败的

查询每年只运行一次以获得最终结果,因此性能不是真正的问题(嵌套的IF查询当前的执行时间为0.0095秒/700行,这是完全足够的),更重要的是,它完全让我恼火,因为它不起作用,并且希望了解原因以供将来参考

作为参考,小时值存储为十进制(8,2),随后总小时值也是相同类型

我想要的输出是:

| 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;
}