如何在MySQL中正确使用CASE..WHEN


71

这是一个演示查询,请注意,它非常简单,仅在base_price为0的地方获取,并且仍然选择条件3:

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    WHEN course_enrollment_settings.base_price<101      THEN 2
    WHEN course_enrollment_settings.base_price>100 AND   
                      course_enrollment_settings.base_price<201 THEN 3
        ELSE 6
   END AS 'calc_base_price',
   course_enrollment_settings.base_price
FROM
    course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0

base_pricedecimal(8,0)

在数据库上运行此命令时,我得到:

3 0
3 0
3 0
3 0
3 0

Answers:


70

删除course_enrollment_settings.base_price后立即CASE

SELECT
   CASE
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    ...
    END

CASE有两种不同的形式,如手册中所述。在这里,您要使用第二种形式,因为您正在使用搜索条件


如果要按值排序,由于没有列别名,order by子句会是什么样?
HPWD

38
CASE case_value
    WHEN when_value THEN statements
    [WHEN when_value THEN statements]
    ELSE statements
END 

要么:

CASE
WHEN <search_condition> THEN statements
[WHEN <search_condition> THEN statements] 
ELSE statements
END 

这里的CASE是第二种情况下的表达式search_condition将求值,如果search_condition不相等,则执行else

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1

应该

SELECT
   CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1

括号是什么?[]
Shafizadeh,2015年

@Shafizadeh表示您可以在第一个语句之后添加更多when语句。
Douwe de Haan

14

CASE course_enrollment_settings.base_price 在这里错了,应该只是 CASE

SELECT 
CASE 
WHEN course_enrollment_settings.base_price = 0      THEN 1 
WHEN course_enrollment_settings.base_price<101      THEN 2 
WHEN course_enrollment_settings.base_price>100 AND    
                  course_enrollment_settings.base_price<201 THEN 3 
    ELSE 6 
END AS 'calc_base_price', 
course_enrollment_settings.base_price 
FROM 
  course_enrollment_settings 
WHERE course_enrollment_settings.base_price = 0 

一些解释。您的原始查询将执行为:

SELECT 
CASE 0
WHEN 0=0 THEN 1 -- condition evaluates to 1, then 0 (from CASE 0)compares to 1 - false
WHEN 0<1 THEN 2 -- condition evaluates to 1,then 0 (from CASE 0)compares to 1 - false
WHEN 0>100 and 0<201 THEN 3 -- evaluates to 0 ,then 0 (from CASE 0)compares to 0 - true
ELSE 6, ...

这就是为什么你总是得到3


1
“不需要”是不精确的。这是“你不应该拥有”。
Lightness Races in Orbit

@奥比的Lightness Races:同意;我改变了它,并添加一些说明
a1ex07

添加列别名时出现错误AS 'calc_base_price。我通过在整个括号内加上括号来解决了问题(CASE ... END)
pgr

6
SELECT
   CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    WHEN course_enrollment_settings.base_price>0 AND  
         course_enrollment_settings.base_price<=100     THEN 2
    WHEN course_enrollment_settings.base_price>100 AND   
         course_enrollment_settings.base_price<201      THEN 3
        ELSE 6
   END AS 'calc_base_price',
   course_enrollment_settings.base_price
FROM
    course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0

乌拉圭回合的状况略有改变。。添加了<= 100而不是<101
Teja 2012年

5

两种变体CASE,您没有使用自己认为的一种。

你在做什么

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

每个条件大致等同于if (case_value == when_value)(伪代码)。

但是,您将整个条件设置为when_value,导致类似:

if (case_value == (case_value > 100))

现在,(case_value > 100)计算为FALSE,这是您执行此操作的唯一条件之一。所以,现在您有了:

if (case_value == FALSE)

FALSE转换为0,通过生成的完整表达式,if (case_value == 0)您现在可以看到触发第三个条件的原因。

你应该做什么

删除第一个,course_enrollment_settings使之不存在case_value,使MySQL知道您打算使用以下的第二个变体CASE

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

现在,您可以提供完整的条件search_condition

另外,请阅读文档以了解所使用的功能。


1
我需要的是-这很清楚,我可以实际适应自己的情况。
贝蒂·莫克

1

我认为部分原因在于您要说明要选择的值CASE,然后再使用WHEN x = y语法,这是两种不同的using方法的组合CASE。应该是

CASE X
  WHEN a THEN ...
  WHEN b THEN ...

要么

CASE
  WHEN x = a THEN ...
  WHEN x = b THEN ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.