首页 > 解决方案 > MYSQL 中多个 CASE-WHEN VS 多个 IF 语句之间的区别

问题描述

我了解到 CASE 和 IF 语句之间的区别如下“IF 是只有一个 'WHEN' 语句的 CASE”。但是当我查询这个时我很困惑:

我有一张奥运会表,其中包含与之相关的国家和奖牌。我正在计算每个国家获得的奖牌总数。第一个查询产生正确的输出,但第二个查询没有产生正确的输出。谁能说出 case-when 和 if 语句在这里工作不同的原因?

第一次查询

select
    NOC,
    COUNT(IF (medal = "GOLD", medal, NULL)) as GOLD,
    COUNT(IF (medal = "SILVER", medal, NULL)) as SILVER,
    COUNT(IF (medal = "BRONZE", medal, NULL)) as BRONZE
from olympics 
group by NOC;

查询 1 输出

第二次查询

select NOC,
count(case when MEDAL='GOLD' then '1' ELSE 0 end) as GOLD,
count(case when MEDAL='SILVER' then '1'  ELSE 0 end) as SILVER,
count(case when MEDAL='BRONZE' then '1' ELSE 0 end) as BRONZE
from olympics 
group by NOC

查询 2 输出

标签: mysqlsql

解决方案


你有COUNT()不正确的,因为COUNT(<expression>)计算非NULL值的数量。您的表达式总是返回一个非NULL值,因此所有三个值都是相同的。

如果您正在使用COUNT(),则ELSE需要NULL它才能工作:

count(case when MEDAL = 'GOLD' then 1 end) as GOLD,

(默认为NULL。)

或者,您可以使用SUM().

我删除了单引号。计算什么并不重要。这是标准 SQL,因此建议(在我看来)IF()在 MySQL 中使用定制扩展。

如果要使用 SQL 扩展,不妨使用更方便的扩展:

sum( MEDAL = 'GOLD' ) as GOLD

MySQL 将布尔值视为整数,“1”代表真,“0”代表假。


推荐阅读