我正在学习一门关于sql的数据营课程。本课程研究欧洲足球数据库。
本课程的一部分讨论如何使用 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
子句do,如第一个查询中所示?
如果我们在 CASE
那么为什么不以 WHERE outcome IS NOT NULL
?
再说一次,我明白,如果完全只是为了教一个原则——在这种情况下,第一个问题仍然存在——但假设在所有这些冗长的背后有一个更深刻、更复杂的原因,那是什么呢?
2条答案
按热度按时间cigdeys31#
你说得对,应该是
where
如你所写的条款。where
只需要一个布尔值。我想不出有什么理由把它当作一个教学例子。
这样会稍微有点道理:
至少没有多余的字符串
else
这种情况更为明显,但这仍然是一种非常不寻常的写作方式where
条款。如果我们在筛选case子句,那么为什么不简单地以结果不为null的地方结束呢?
大多数数据库不支持使用列别名,如
outcome
在一个where
条款。sqlite确实如此,但我建议不要习惯非标准特性。tzcvj98z2#
在一个
WHERE
你通常要避免CASE
表达。原因很简单,就是CASE
表达式强制执行特定的求值顺序。强制执行求值顺序会影响优化器生成最佳查询计划的能力。如果解决方案坚持使用
CASE
. 虽然有些情况下CASE
表达法在英语中很有用WHERE
从句,你描述的不是其中之一。