Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL仅在第一个TRUE条件下返回_Sql_Oracle - Fatal编程技术网

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;