【问题标题】:MySQL CASE statement returning nullMySQL CASE 语句返回 null
【发布时间】:2022-10-13 00:11:30
【问题描述】:

我有两个“相同”的操作

(1)

SELECT ticket_type_name
, amount as 'original_amount'
, CASE ticket_type_name
        WHEN ticket_type_name = 'General Admission - Friday' 
        and amount > 0 THEN amount / 400
    END AS 'NewAmount'
from analytics.deleteme

(2)

select distinct ticket_type_name, amount, amount/400 AS NewAmount
from analytics.deleteme
where amount > 0
and ticket_type_name = 'General Admission - Friday'

第一条语句生成 NULL 值 第二条语句生成正确的值 1 (400/400)

我在最后添加了一个 ELSE 语句:

SELECT DISTINCT ticket_type_name
, amount as 'original_amount'
, CASE ticket_type_name
        WHEN ticket_type_name = 'General Admission - Friday'    and amount > 0   THEN amount / 400
        else amount/575
    END AS 'NewAmount'
from analytics.deleteme
where amount > 0

结果与应有的相反! GA 星期五应该是 400/400 = 1 其他一切,例如 GA 周末应该除以 575(=0.82,而不是 1.18!)

ticket_type_name, amount, NewAmount一般入场费 - 周五 400.0 0.69 一般入场 - 周末 475.0 1.18 普通入场 - 周六 375.0 0.93 儿童(12 至 14 岁)- 周末 100.0 0.25 儿童(12 至 14 岁) - 周六 50.0 0.125

【问题讨论】:

  • 问题不清楚,没有提供样本数据(甚至 ddl)。
  • 试试CASE WHEN ticket_type_name = 'General Admission - Friday' and amount > 0 THEN amount / 400 else amount/575 END

标签: mysql sql


【解决方案1】:

我可以复制你的错误。

只需在 CASE 之后删除 ticket_type_name 即可:

SELECT 
  DISTINCT ticket_type_name,
  amount AS 'original_amount',
  CASE 
    WHEN 
      ticket_type_name = 'General Admission - Friday'
      AND amount > 0
    THEN 
      amount / 400
    ELSE 
      amount / 575
  END AS 'NewAmount'
FROM analytics.deleteme
WHERE amount > 0;

您不需要在CASEWHEN 之间添加任何内容,但有趣的是这如何破坏了查询。下面的第一条评论完美地解释了原因。

作为替代方案,您可以将ticket_type_name 移动到CASE 之后,并将比较值放在WHEN 之后。像这样:

SELECT 
  DISTINCT ticket_type_name,
  amount AS 'original_amount',
  CASE ticket_type_name 
    WHEN 
      'General Admission - Friday'
    THEN 
      amount / 400
    ELSE 
      amount / 575
  END AS 'NewAmount'
FROM analytics.deleteme
WHERE amount > 0;

长话短说:使用CASE field WHEN value…CASE WHEN condition…。你不想使用CASE field WHEN condition…

【讨论】:

  • 我想知道它是否是mysql 错误。给定ticket_type_name 可能是varchar 列。和ticket_type_name = 'General Admission - Friday' 评估为truevarchar永远不相等到布尔值。因此,它将落在else 子句上。 the docs 肯定有两种case 语句的使用语法。这是第一个。 fiddle
  • @BagusTesa 这肯定是正确的解释!我不会称它为错误(这是预期的行为),但它绝对令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多