我有一个简单的查询,如果很多条件中的第一个为真,我只想返回一个值。
查询如下所示:
SELECT * FROM table
WHERE case column
when val1 then 1
when val2 then 1
when val3 then 1
end = 1
在表中,可以是所有值(val1,val2和val3)的行,但不是强制性的,我只想返回条件为true的第一行,并放弃其余条件。
对于我的SQL版本,select语句返回所有TRUE条件的行。
你能帮我吗。
据我了解,您的要求:您可以在不同条件下找到匹配项。您只想返回最匹配的行。
一个典型的例子是设置表,其中可以包含国家,城市甚至地区的设置。您需要区域设置(如果可用),或者城市设置,并且只有在城市设置不可用的情况下,您才能满足于全球国家/地区设置。
对于这样的排名,您可以使用ROW_NUMBER
。也就是说,您对行进行编号,给出最佳匹配#1,第二最佳匹配#2,依此类推。然后,您仅使行保持排名#1。
select *
from
(
select
s.*,
row_number()
over (order by case
when s.country = :country
and s.city = :city
and s.district = :district then 1
when s.country = :country
and s.city = :city then 2
else 3
end) as rn
from settings s
where s.country = :country
)
where rn = 1;
在您的示例中:
select *
from
(
select
t.*,
row_number()
over (order by case column when val1 then 1 when val2 then 2 else 3 end) as rn
from table t
where column in (val1, val2, val3)
)
where rn = 1;
如果可以联系,即如果至少有一行匹配val1,则显示所有匹配val1的行,依此类推,然后使用RANK
或DENSE_RANK
代替ROW_NUMBER
。
从Oracle 12c开始,您还可以使用以下FETCH
子句:
select *
from table
where column in (val1, val2, val3)
order by row_number()
over (order by case column when val1 then 1 when val2 then 2 else 3 end)
fetch first row only;
同样,如果您想允许平局,请使用RANK
或DENSE_RANK
并替换FETCH FIRST ROW ONLY
为FETCH FIRST ROW WITH TIES
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句