Where子句基于优先级

时间:2013-10-18 18:54:18

标签: sql oracle

考虑下面的名为A的表:

  State City Rank
   S     C    1
  AB     C1   2
   *     C2   3

我想选择所有列

  1. 如果State为AB则返回所有此类行
  2. 如果不满足条件1,则返回状态为*的所有行。如果满足条件1,请不要考虑这种情况
  3. 按照上面的例子,我应该得到第2行。我尝试了几件事,比如

    select state
         case when a.state = 'AB' then 1
               when a.state = '*'  then 2
          end as priority   from A  where state in  ('AB','*')  order by priority
    

    但是上面的查询会返回多行。我想要完全符合上述条件的一行。

    请帮忙

    EDIT1:

    由于性能问题,我想避免子查询。

1 个答案:

答案 0 :(得分:3)

试试这个:

select * from A
where state=case
  when exists(select * from A where state='AB') then 'AB'
  else '*'
  end

以上SQL Fiddle展示了上述内容。