mysql - 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;
第二次查询
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
解决方案
你有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”代表假。
推荐阅读
- amazon-athena - 如何在 Athena 中执行模式(数据库)重命名?
- python - 来自 CSV 的 URL 没有传递给函数
- java - 如果我必须处理 API 服务而不是 CSV 作业,是否需要 Spring Batch?
- javascript - 如何让火鸡在点击时跳跃
- c++ - SMFL 的 2D 射线投射问题
- javascript - 如何在增量达到特定数字时停止 mousedown 事件
- html - Bootstrap 4:不希望导航栏容器内的下拉项目
- python - 扭曲的测验服务器,python3,参数
- python - Python 3 数字名称长度
- c++ - 计算RotatedRect OpenCV内白色像素的百分比