如何在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_price
是decimal(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 ...