案例陈述中有多个AND条件

时间:2019-08-16 18:34:50

标签: sql oracle case multiple-conditions

我有一个包含表YEAR和STATUS的Oracle表CUST。我正在尝试编写一条语句来选择其中((CUST.YEAR ='2017'和CUST.STATUS ='ACTIVE')和(CUST.YEAR ='2018'和CUST.STATUS ='ACTIVE')的记录))。当这两个语句都为真时,我想返回“ 1”,否则返回“ 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脚本的经验不足)。我试图结合两个选择语句,由于语法错误,我要么得到数万行,要么得到错误。甚至在尝试使用case语句返回比较结果之前(如果这两个条件均为“ 1”,否则为“ 0”)。

我意识到这可能是相当基本的东西,但是到目前为止,语法已经超出了我的范围。会有足够的好心帮助我构建这个陈述吗?

我几次在这个论坛上发帖,我学到了一些使我更加自给自足的东西,所以我在此先表示感谢。

3 个答案:

答案 0 :(得分:1)

根据我的理解,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')

答案 1 :(得分:1)

您可以在这里利用IN

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

答案 2 :(得分:0)

如果我正确地理解了您的要求,则要确定您的表是否同时具有这两个条件对的记录,即您是否同时具有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 )
/