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 子句基于优先级的主要内容,如果未能解决你的问题,请参考以下文章