如果结果计数大于1,如何添加where条件

时间:2014-09-18 11:04:46

标签: sql oracle

我想构建返回唯一ID的SQL查询。 我的问题是我需要添加另一个条件来查询我是否有多个结果。

select u.id
from users u
where u.id in ('1','2','3')
and u.active = 'Y'

如果我得到多个结果,我需要添加:

and u.active_contact = 'Y'

我尝试构建此查询

select * from (
select u.id, count(u.id) as results
from users u
where u.id in ('1','2','3')
and u.active = 'Y'
group by u.id
) tab
If(tab.results > 1) then
    where tab.u.active_contact = 'Y'
end

先谢谢。

希望我能够很好地解释自己。

3 个答案:

答案 0 :(得分:0)

这是一种不同的方法:

SELECT id
  FROM (SELECT id, (CASE WHEN active ='Y' THEN 1 ELSE 0 END) + (CASE WHEN active_contact ='Y' THEN 1 ELSE 0 END) as actv FROM users ORDER BY actv DESC)
  WHERE actv > 0
  LIMIT 1

子查询添加了一个聚合activeactive_contact的列。然后主SELECT优化这两个字段的组合,至少需要其中一个字段。我相信这可以提供预期的结果。

答案 1 :(得分:0)

在解决这个问题的可能方法中,有两个。

1)使用active_contact id。如果没有人使用其他身份证。

select coalesce( max(case when active_contact = 'Y' then id end), max(id) ) as id
from users
where id in ('1','2','3')
and active = 'Y';

2)首先排序active_contact。然后得到第一条记录。

select id
from
(
  select id
  from users
  where id in ('1','2','3')
  and active = 'Y'
  order by case when active_contact = 'Y' then 1 else 2 end
) where rownum = 1;

答案 2 :(得分:0)

使用分析函数的方法

SELECT id
FROM (SELECT u.id
           , u.active_contact
           , count(*) OVER () actives
      FROM users u
      WHERE u.id IN ('1','2','3')
      AND u.active = 'Y')
WHERE (  actives = 1
      OR (   actives > 1
         AND active_contact = 'Y'))

如果有多个记录active = 'Y' AND active_contact = 'Y',它将全部返回。如果只需要其中一个,则需要确定选择该标准的标准。