【问题标题】:Simple SQL CASE Question - from WHERE to CASE function简单的 SQL CASE 问题 - 从 WHERE 到 CASE 函数
【发布时间】:2020-10-07 05:12:03
【问题描述】:

抱歉这个菜鸟问题,这里是 SQL 新手,希望得到帮助:)

我有这个 SQL 查询:

select * from nobel_win 
where (subject = 'Physiology' and year < 1971) 
and (subject = 'Peace' and year => 1974) 

如果我使用这个查询,我会得到相同的结果吗? (我在这里正确应用了 case 函数吗?)如果没有,如果可能的话,有人可以帮我解决下面的查询吗?

select * 
(case when subject = 'Physiology' and year < 1971 end),
(case when subject = 'Peace' and year => 1974 end),
from nobel_win

*编辑

原来的查询实际上是这样的,我尝试通过 WHERE 来缩短 UNION(参考第一个代码块)。有人可以更正我的第一个代码块,以便它显示相同的输出吗?非常感谢:(

(select * from nobel_win
where subject = 'Physiology' and year < 1971)
UNION
(select * from nobel_win
where subject = 'Peace' and year => 1974)

【问题讨论】:

  • 不,第一个查询将不返回任何结果,第二个查询将不会运行,因为它有语法错误。
  • 如果你自己尝试一下,你会很快找到答案No,即使第二个没有语法错误,第二个的结果集也比第一个大
  • 没有。排除数据的过滤器在哪里。 Case when 是解码某些东西,但它将获取所有数据而没有任何排除。所以qn是你想要的吗?过滤后的数据或所有带有解码逻辑的数据。

标签: sql case where-clause


【解决方案1】:

事实上,第一个版本,或者稍微修改一下,很可能就是你想要的:

SELECT *
FROM nobel_win 
WHERE
    subject = 'Physiology' AND year < 1971 OR
    subject = 'Peace' AND year >= 1974;

请注意,我将这两个条件进行了 OR 运算,因为一条记录不可能属于多个学科(或年份)。请注意,CASE 表达式不是用于处理布尔逻辑,而是根据特定逻辑输出标量值。

【讨论】:

  • 知道了!尽管有“或”只会给我两者之一,对吗?我实际上想显示两个结果。我附加了我的帖子以包含我试图缩短的原始 UNION 查询
  • 我的回答在逻辑上等同于你写的联合查询。请注意,您也可以使用UNION ALL 而不是UNION,以获得更好的性能。
  • 哇,我有这么多 SQL 学习要做.. 非常感谢 :)
  • @tim,您必须使用“(”作为 OR 条件,否则条件会出错。
  • @B.Muthamizhselvi 完全不正确。 AND 的优先级高于 OR,因此您建议放入的括号在逻辑上已经存在。
【解决方案2】:

如果你真的想那样做,可以这样做,例如:

SELECT *
FROM nobel_win
WHERE 1 = 
    CASE
        WHEN subject = 'Physiology' AND year < 1971 THEN 1
        WHEN subject = 'Peace' AND year >= 1974 THEN 1
        ELSE 0
    END
    

【讨论】:

    【解决方案3】:

    试试下面的查询

    第一次查询

    SELECT *
    FROM nobel_win 
    WHERE
    (subject = 'Physiology' AND year < 1971)
    OR (subject = 'Peace' AND year >= 1974);
    

    第二次查询

    它的语法错误。在您的案例中,缺少“那么”的陈述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多