sql筛选器中的case vs or

bq8i3lrv  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(243)

我正在学习一门关于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 ?
再说一次,我明白,如果完全只是为了教一个原则——在这种情况下,第一个问题仍然存在——但假设在所有这些冗长的背后有一个更深刻、更复杂的原因,那是什么呢?

cigdeys3

cigdeys31#

你说得对,应该是 where 如你所写的条款。 where 只需要一个布尔值。
我想不出有什么理由把它当作一个教学例子。
这样会稍微有点道理:

WHERE CASE
      WHEN hometeam_id = 8455 AND home_goal > away_goal THEN
        true
      WHEN awayteam_id = 8455 AND home_goal < away_goal THEN
        true
      ELSE
        false
      END

至少没有多余的字符串 else 这种情况更为明显,但这仍然是一种非常不寻常的写作方式 where 条款。
如果我们在筛选case子句,那么为什么不简单地以结果不为null的地方结束呢?
大多数数据库不支持使用列别名,如 outcome 在一个 where 条款。sqlite确实如此,但我建议不要习惯非标准特性。

tzcvj98z

tzcvj98z2#

在一个 WHERE 你通常要避免 CASE 表达。原因很简单,就是 CASE 表达式强制执行特定的求值顺序。强制执行求值顺序会影响优化器生成最佳查询计划的能力。
如果解决方案坚持使用 CASE . 虽然有些情况下 CASE 表达法在英语中很有用 WHERE 从句,你描述的不是其中之一。

相关问题