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

时间:2013-01-28 16:48:04

标签: sql oracle count

员工表包含ID和NAME列。名称可以重复。我想知道是否至少有一行名称如'kaushik%'。

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

是否可以使用单个查询找到它。 如果我们尝试像

那样的话
select count(1) from employee where name like 'kaushik%'

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

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

SELECT COUNT(*) FROM employee WHERE name like 'kaushik%' AND rownum = 1

4 个答案:

答案 0 :(得分:35)

通常,你将其表达为

SELECT COUNT(*)
  FROM employee
 WHERE name like 'kaushik%'
   AND rownum = 1

rownum = 1谓词允许Oracle在找到第一个匹配行后立即停止查看

SELECT 1
  FROM dual
 WHERE EXISTS( SELECT 1
                 FROM employee
                WHERE name like 'kaushik%' )

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

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

答案 1 :(得分:5)

怎么样:

select max(case when name like 'kraushik%' then 1 else 0 end)
from employee

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

select count(x)
from (select 1 as x
      from employee
      where name like 'kraushik%'
     ) t
where rownum = 1

答案 2 :(得分:3)

因为你要求sql查询应该返回1或0,那么你可以尝试以下查询: -

select count(1) from dual 
where exists(SELECT 1 
             FROM employee
             WHERE name like 'kaushik%')

由于上述查询使用Exists,因此它将扫描employee表,一旦遇到名称与“kaushik”匹配的第一条记录,它将返回1(不扫描表的其余部分)。如果没有记录匹配,则返回0。

答案 3 :(得分:1)

select 1 
 where exists ( select name 
                  from employee 
                  where name like 'kaushik%'
               )