这是一个演示查询,请注意它非常简单,仅在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_price
是decimal(8,0)
在我的数据库上运行时,我得到:
3 0
3 0
3 0
3 0
3 0
答案 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 ...