SQL仅在第一个TRUE条件下返回
我有一个简单的查询,我只想返回一个值,以防多个条件中的第一个条件为真 查询如下所示:SQL仅在第一个TRUE条件下返回,sql,oracle,Sql,Oracle,我有一个简单的查询,我只想返回一个值,以防多个条件中的第一个条件为真 查询如下所示: 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 * 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条件的行
您能帮我一下吗。我理解您的要求:您可以在不同的条件下找到匹配项。您只想返回最匹配的行 一个典型的例子是设置表,它可以包含国家、城市甚至地区的设置。如果可用,您需要地区设置,否则需要城市设置。只有在不可用的情况下,您才能满足于全球国家/地区设置 对于这样的排名,您可以使用行数。也就是说,对行进行编号,给出最佳匹配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的行,以此类推,然后使用秩或密集秩而不是行数
从Oracle 12c开始,您还可以使用FETCH子句:
同样,如果您想允许使用tie,请使用RANK或densite_RANK,并将FETCH FIRST ROW ONLY替换为FETCH FIRST ROW with ties。您的查询中缺少一些组件,例如,当val1=123时,当val2=456时,则为1……它在SQL server上正常工作,Sqllite@ThorstenKettner:我的CASE语句与:CASE when column=val1、1 when column=val2、1 when column=val3、1 end=1Oh相同,愚蠢的我。是的,我看错了。很抱歉
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;