Where 子句基于优先级

Posted

技术标签:

【中文标题】Where 子句基于优先级【英文标题】:Where clause based on priority 【发布时间】:2013-10-18 18:54:18 【问题描述】:

考虑下表 A:

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

我想选择所有列,这样

    如果 State 为 AB,则返回所有此类行 如果不满足条件 1,则返回状态为 * 的所有行。如果满足条件 1,则不要关注此条件

按照上面的例子,我应该得到第 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

但上面的查询返回不止一行。我想要准确的一行符合上述条件。

请帮忙

编辑1:

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

【问题讨论】:

【参考方案1】:

试试这个:

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

这是演示上述内容的SQL Fiddle

【讨论】:

好吧,我认为你做不到。必须有一种方法来确定是否至少存在一个带有state='AB' 的行,以便将条件引导到正确的比较。因此,exists 子查询或 count/group by 子查询都是不可避免的——除非我遗漏了一些非常明显的东西。 @geomagas,+1,很好的干净查询,可以准确地获得 OP 的要求。我添加了 SQL Fiddle 以进一步说明您的答案。

以上是关于Where 子句基于优先级的主要内容,如果未能解决你的问题,请参考以下文章

优先考虑 SQL WHERE 子句

GROUP BY,WHERE,HAVING之间的区别和用法

GROUP BY,WHERE,HAVING之间的区别和用法

Linq to entity 没有生成 where 子句

oracle查询优化

sql优化