如果查询返回一行,如何选择记录,如果查询返回更多行,则选择无记录

Sta*_*ino 5 sql oracle

在oracle SQL中,如果只存在一行,我需要选择一行,如果有更多行,则应选择0行.

Chr*_*xon 5

如果您正在使用PL/SQL,那么如果返回了多行,则选择使用列select-into将抛出too_many_rows异常:

declare
  var table.column%type;
begin
  select column
  into   var
  from   table
  where  ...;
end;
Run Code Online (Sandbox Code Playgroud)

如果您只想使用SQL来执行此操作,那么您可以执行以下操作:

select *
from
  (select s.*, count(*) over () c
   from
    (select *
     from table
     where ...
     and   rownum <= 2
    ) s
)
where c = 1
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如DazzaL在评论中所说,rownum <= 2限制的原因是如果结果集中有超过2行,则会使查询短路.如果数据集很大,这可以带来显着的性能优势.

  • @StalinGino克里斯提出`rownum <= 2`的原因是为了表现.即最多只计算两行(否则,如果你的查询匹配了数百万行,那么你要求Oracle对它们进行全部计算,如果有2行以上需要更多时间,则将它们全部丢弃). (5认同)