确定是否存在至少一个具有给定条件的行

Kau*_*ele 24 sql oracle count

Employee表具有ID和NAME列.名称可以重复.我想知道是否至少有一行名称如'kaushik%'.

因此查询应该返回true/false或1/0.

是否可以使用单个查询找到它.如果我们尝试类似的东西

select count(1) from employee where name like 'kaushik%'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它不会返回true/false.我们也在迭代表中的所有记录.在简单的SQL中是否存在这样的方式:每当获取满足条件的第一条记录时,它应该停止检查更多记录.或者这样的事情只能在Pl/SQL块中处理?

编辑* 贾斯汀提供的第一种方法看起来正确答案

SELECT COUNT(*) FROM employee WHERE name like 'kaushik%' AND rownum = 1
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 36

通常,你也可以表达这一点

SELECT COUNT(*)
  FROM employee
 WHERE name like 'kaushik%'
   AND rownum = 1
Run Code Online (Sandbox Code Playgroud)

其中rownum = 1谓词允许Oracle,就立即停止寻找,因为它找到的第一个匹配行或

SELECT 1
  FROM dual
 WHERE EXISTS( SELECT 1
                 FROM employee
                WHERE name like 'kaushik%' )
Run Code Online (Sandbox Code Playgroud)

EXISTS子句允许Oracle在找到第一个匹配行后立即停止查看.

第一种方法稍微紧凑,但在我看来,第二种方法更清晰,因为你真的想确定一个特定的行是否存在而不是试图计算某些东西.但第一种方法也很容易理解.

  • @KaushikLele - 一旦找到第一个匹配的行,两个查询都将停止处理.正如我在我的回答中所说,当你使用`EXISTS`子句时,Oracle知道它一旦返回一行就可以停止在`EXISTS`子句中评估查询. (2认同)

Gor*_*off 6

怎么样:

select max(case when name like 'kraushik%' then 1 else 0 end)
from employee
Run Code Online (Sandbox Code Playgroud)

或者,因为like可以使用索引可能更有效:

select count(x)
from (select 1 as x
      from employee
      where name like 'kraushik%'
     ) t
where rownum = 1
Run Code Online (Sandbox Code Playgroud)