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

时间:2012-03-06 16:41:38

标签: mysql sql conditional switch-statement case

这是一个演示查询,请注意它非常简单,仅在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

6 个答案:

答案 0 :(得分:50)

course_enrollment_settings.base_price之后立即删除CASE

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

CASE有两种不同的形式,详见manual。在这里,您需要第二个表单,因为您正在使用搜索条件

答案 1 :(得分:32)

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

答案 2 :(得分:11)

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

答案 3 :(得分:5)

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

答案 4 :(得分:5)

two variants of 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的完整条件。

另外,请阅读您使用的功能的文档。

答案 5 :(得分:1)

我认为部分原因是你在CASE之后陈述了你选择的价值,然后使用WHEN x = y语法,这是两种不同的使用方法的组合{{ 1}}。它应该是

CASE

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