【问题标题】:SQL case - else condition visited even when other condition is trueSQL case - else 条件即使在其他条件为真时也已访问
【发布时间】:2020-09-13 17:41:13
【问题描述】:

这是我的查询 -

Select distinct P1.PastaName, P1.PastaColor,
CASE
    When
  S1.SauceID = P1.PastaID
THEN S1.SauceType
ELSE NULL
END AS PastaCombo
From Pasta P1, Sauce S1

无论 Pasta ID 和 Sauce ID 是否匹配,我都希望每个 Pasta 只返回一行。然而,事实并非如此。当 Pasta ID 和 Sauce ID 不匹配时,返回的 PastaCombo 值为 null 的意大利面只有一行。但是,如果 Pasta ID 和 Sauce ID 匹配,则返回的 Pasta 有两行 - 一行显示“Pasta Combo”,另一行显示“null”。

这是为什么呢?当有匹配项并且只返回“Pasta Combo”而不是 null 时,如何将结果减少到一行?

据此 - https://dba.stackexchange.com/questions/43352/does-sql-server-case-statement-evaluate-all-conditions-or-exit-on-first-true-con - 只有在不存在真条件时才会访问 else 条件。但是我这边有一个真实的条件,所以我不确定为什么要访问 else 条件。

这就是我想要的结果

PastaName           PastaColor       SauceType
_________           __________       __________

Ravioli              Brown           Tomato

【问题讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法!更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!
  • 轻松为您提供帮助,向我们展示一些示例表数据、当前结果和想要的结果 - 全部为格式化文本(无图像)。minimal reproducible example
  • 您将其标记为 mysql 并参考有关 sql server 的链接,它们是不同的 rsms,因此无法以相同的方式做出反应。请添加minimal reproducible example,以便我们更好地了解您的问题
  • 选择列表 case 表达式不过滤。请改用 JOIN ... ON。
  • 我已经尝试过使用 join @jarlh。我还用我希望结果的示例更新了我的帖子。这是我所做的连接:“从 Pasta P1 JOIN 中选择不同的 P1.PastaName, P1.PastaColor (SELECT S1.SauceType from Sauce S1) as Italian”。 Pasta 和 Sauce 都有一个它们之间共有的 ID 属性。但是,如果我使用 ON 将它们设置为彼此相等,则会出现错误。使用当前的连接语句,不会显示 SauceType。是的,如果没有匹配项,我确实希望显示 null。

标签: sql case


【解决方案1】:

有了这个:

From Pasta P1, Sauce S1

您实际上所做的是 2 个表的 CROSS 连接,这意味着行的笛卡尔积。
我怀疑你想要的是LEFT 加入:

SELECT DISTINCT 
  P1.PastaName, P1.PastaColor,
  CASE WHEN S1.SauceID IS NOT NULL THEN 'Pasta Combo' END AS PastaCombo
FROM Pasta P1 LEFT JOIN Sauce S1
ON S1.SauceID = P1.PastaID

或使用EXISTS 不加入:

SELECT DISTINCT 
  P1.PastaName, P1.PastaColor,
  CASE WHEN (EXISTS SELECT 1 FROM Sauce S1 WHERE S1.SauceID = P1.PastaID) THEN 'Pasta Combo' END AS PastaCombo
FROM Pasta P1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2018-07-21
    • 2016-10-08
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多