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

这里是一个演示查询,注意它非常简单,仅在base_price为0的位置获取,并且仍然select条件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

CASE之后立即删除course_enrollment_settings.base_price

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

CASE有两种不同的forms,详见手册 。 在这里,你需要第二种forms,因为你正在使用search条件

 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是第二种情况下的expression式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 

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

 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 

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并通过生成的完整expression式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

另外,请阅读文档以了解您使用的function。

我认为其中的一部分就是说明您在CASE之后select的值,然后使用WHEN x = y语法,这是两种使用CASE不同方法的组合。 它应该是

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

要么

 CASE WHEN x = a THEN ... WHEN x = b THEN ...