【发布时间】:2020-11-08 13:59:16
【问题描述】:
我正在学习关于 SQL 的 DataCamp 课程。本课程考察European soccer database。
课程的一部分讨论了使用CASE 作为过滤器,这样您就不会留下一大堆NULL 值。提供以下代码来专门过滤切尔西的主场和客场胜利:
SELECT date, season,
CASE WHEN hometeam_id = 8455 AND home_goal > away_goal
THEN 'Chelsea home win!'
WHEN awayteam_id = 8455 AND home_goal < away_goal
THEN 'Chelsea away win!' END AS outcome
FROM match
WHERE CASE WHEN hometeam_id = 8455 AND home_goal > away_goal
THEN 'Chelsea home win!'
WHEN awayteam_id = 8455 AND home_goal < away_goal
THEN 'Chelsea away win!' END IS NOT NULL;
看这段代码,似乎有些多余。例如,过滤器中的CASE 再次定义类别,即使它是在SELECT 子句中完成的。在我看来,在过滤器中简单地使用AND 和OR 会更有利:
SELECT date, season,
CASE WHEN hometeam_id = 8455 AND home_goal > away_goal
THEN 'Chelsea home win!'
WHEN awayteam_id = 8455 AND home_goal < away_goal
THEN 'Chelsea away win!' END AS outcome
FROM match
WHERE (hometeam_id = 8455 AND home_goal > away_goal)
OR (awayteam_id = 8455 AND home_goal < away_goal);
有几个问题。
- 像这样使用
CASE子句有什么特别的原因吗?还是 DataCamp 课程只是以可教的方式在过滤器中使用CASE,而这种特殊情况不一定有实际用途? - 如第一个查询所示,在过滤
CASE子句中分配类别有什么作用? - 如果我们在
CASE子句上进行过滤,那么为什么不简单地以WHERE outcome IS NOT NULL结尾呢?
再次,我理解这是否完全只是为了教授一个原则——在这种情况下,第一个问题仍然存在——但假设所有这些冗长背后有更深层次、更复杂的原因,那是什么?
【问题讨论】:
-
在
where子句中使用case是不寻常且不必要的。