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

Ita*_*vka 59 mysql sql conditional case switch-statement

这是一个演示查询,请注意它非常简单,仅在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
Run Code Online (Sandbox Code Playgroud)

base_pricedecimal(8,0)

在我的数据库上运行时,我得到:

3 0
3 0
3 0
3 0
3 0

NPE*_*NPE 57

course_enrollment_settings.base_price立即删除CASE:

SELECT
   CASE
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    ...
    END
Run Code Online (Sandbox Code Playgroud)

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


kap*_*das 32

CASE case_value
    WHEN when_value THEN statements
    [WHEN when_value THEN statements]
    ELSE statements
END 
Run Code Online (Sandbox Code Playgroud)

要么:

CASE
WHEN <search_condition> THEN statements
[WHEN <search_condition> THEN statements] 
ELSE statements
END 
Run Code Online (Sandbox Code Playgroud)

这里CASE是第二种情况下的表达式,search_condition将进行评估,如果没有search_condition相等,则执行else

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1
Run Code Online (Sandbox Code Playgroud)

应该

SELECT
   CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1
Run Code Online (Sandbox Code Playgroud)

  • 括号是什么?`[` 和 `]` (3认同)

a1e*_*x07 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 
Run Code Online (Sandbox Code Playgroud)

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

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, ...
Run Code Online (Sandbox Code Playgroud)

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


Tej*_*eja 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
Run Code Online (Sandbox Code Playgroud)


Lig*_*ica 5

两种变体CASE,你没有使用你认为的那种.

你在做什么

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE
Run Code Online (Sandbox Code Playgroud)

每个条件都松散地等同于if (case_value == when_value)(伪代码).

但是,你已经将整个条件设置为when_value,导致类似于:

if (case_value == (case_value > 100))
Run Code Online (Sandbox Code Playgroud)

现在,(case_value > 100)评估FALSE,并且是您唯一的条件.所以,现在你有:

if (case_value == FALSE)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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