【问题标题】:Multiple AND conditions in case statementcase语句中的多个AND条件
【发布时间】:2019-08-16 18:34:50
【问题描述】:

我有一个带有字段 YEAR 和 STATUS 的 Oracle 表 CUST。我正在尝试编写一个语句来选择记录 where ((CUST.YEAR = '2017' and CUST.STATUS = 'ACTIVE') 和 where (CUST.YEAR = '2018' and CUST.STATUS = 'ACTIVE' ))。当这两个陈述都为真时,我想返回 '1' else '0'

select *
from cust
where cust.year = '2017' and cust.status = 'Active' 

返回正确的行数 (394)。

select *
from cust
where cust.year = '2018' and cust.status = 'Active'

返回正确的行数 (451)。

这是车轮脱落的地方(由于我对 SQL 脚本缺乏经验)。我尝试将这两个 select 语句结合起来,但由于语法不正确,我要么得到数万行,要么得到错误。这是在尝试使用 case 语句返回比较结果之前(如果这两个条件都存在,则为 '1' 否则为 '0')。

我意识到这可能是非常基本的东西,但到目前为止语法已经超出了我的范围。有人能帮我构建这个语句吗?

我在这个论坛上发帖的几次中学到了一些有助于让我更加自给自足的东西,所以我提前表示感谢。

【问题讨论】:

  • 我尝试将这两个 select 语句合并...你尝试了什么?
  • 至于您的CASE 声明:SELECT CASE WHEN cust.year IN ('2017', '2018') and cust.status = 'Active' THEN 1 ELSE 0 END, cust.year, cust.status, cust.whatever...

标签: sql oracle case multiple-conditions


【解决方案1】:

您可以在此处利用IN

select *
from cust
where cust.year IN ('2017', '2018') and
      cust.status = 'Active' 

【讨论】:

    【解决方案2】:

    按照我的理解,or 可能就是您正在寻找的,即

    select *
    from cust
    where (cust.year = '2017' and cust.status = 'Active')
       or (cust.year = '2018' and cust.status = 'Active');
    

    这——正如威廉所说——导致

    where cust.status = 'Active'
      and cust.year in ('2017', '2018')
    

    【讨论】:

    • and cust.status = 'Active' 对两者来说都是通用的,所以它迫切需要再次重构。
    【解决方案3】:

    如果我正确理解了您的要求,您想确定您的表是否有两个条件对的记录,即您是否有 2017 年和 2018 年的活动记录。到目前为止提供的解决方案将断言是否 任一 条件为真,但不是两者都为真。

    所以这里有一个满足您实际需求的解决方案。我们有一个 WITH 子句,它为每年选择一个活动记录(这就是您所需要的)。内联视图然后计算它找到的记录数。如果计数是 2,那么您在这两年都有活动记录。

    with tst as (
        select cust.cust_id, cust.year
        from   cust
        where  cust.year   = '2017'
        and    cust.status = 'Active' 
        group by cust.cust_id, cust.year
        union  all
        select cust.cust_id, cust.year
        from   cust
        where  cust.year   = '2018'
        and    cust.status = 'Active' 
        group by cust.cust_id, cust.year
    )
    select cust_id
           , case when cnt = 2 then 1 else 0 end as your_condition
    from ( select cust_id, count(*) as cnt
           from tst
           group by cust_id )
    /
    

    【讨论】:

    • 你是对的,我想选择表格是否有两个条件的记录(但感谢其他受访者提出我不应该重复客户的想法.status = 'Active' 如果我将 IN 语句用于 OR 条件)。所以现在我的问题是输出只为 case 语句返回一行(显示“1”——两个条件都满足),但只在一行中。我预计有 200 多行显示“1”或“0”(是或否),也许使用另一个字段/列 cust.cust_id 来识别哪些客户是“1”或“0”? -- 谢谢。,
    • APC 的脚本成功地比较了这两个条件,但我需要我的输出显示所有客户的行,其中包含 cust_id 和比较值('1' 或 '0')的列。我回顾了我最初的问题,我完全放弃了,没有提到输出应该显示所有大约 2000 条带有 cust_id 和比较条件的记录。
    • 也许更好的方法是问是否可以将 WITH 子句插入更长的选择查询中?
    • 不要问另一个非常幼稚的问题(对这个论坛来说很新),但通常会返回并选择原始问题下方的编辑,实质上会覆盖我之前发布的背景和问题,还是在原始问题的末尾添加附加信息?我不想因为我不熟悉正常的约定/协议而对我的处理产生很多仇恨。我喜欢按规则行事。谢谢。
    • 积极鼓励编辑问题以使其更好——更清晰、更集中等。不要担心“仇恨”。与网络的其他角落相比,StackOverflow 实际上是一个非常友好的地方,而且令人惊讶的无毒。确实不是每个人都这么认为,但就像许多在线社区一样,复杂性会带来紧急行为which it is easy to misinterpret
    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多