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

如何在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 THEN statements [WHEN 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 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值