【问题标题】:Identify if at least one row with given condition exists确定是否存在至少一行具有给定条件的行
【发布时间】:2013-01-12 01:54:09
【问题描述】:

Employee 表有 ID 和 NAME 列。名称可以重复。我想知道是否至少有一行名称类似于“kaushik%”。

所以查询应该返回真/假或 1/0。

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

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

在这种情况下,它不会返回真/假。 此外,我们正在遍历表中的所有记录。有没有办法在简单的 SQL 中,每当获取满足条件的第一条记录时,它应该停止检查进一步的记录。 还是只能在 Pl/SQL 块中处理?

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

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

【问题讨论】:

  • Oracle 并没有真正的布尔数据类型。
  • 您可以将 rownum 添加到您的查询中,即从员工中选择 count(1),其中名称如 'kaushik%' 和 rownum = 1;或使用 rownum

标签: sql oracle count


【解决方案1】:

通常,您可以将其表达为

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 在找到第一个匹配行后立即停止查找。

第一种方法更紧凑一些,但在我看来,第二种方法更清楚一些,因为您确实是在寻找特定行是否存在而不是试图计算某些东西。但是第一种方法也很容易理解。

【讨论】:

  • 我不明白您为什么在第一个查询中添加了rownum = 1。由于聚合COUNT(*),查询无论如何都会返回一行。
  • @ypercube 查询将在第一次匹配后停止扫描,正如贾斯汀解释的那样。
  • 另一个区别是SELECT COUNT(*) 版本将返回 0 表示没有结果,而SELECT 1 版本将引发 NO_DATA_FOUND。
  • @KaushikLele - 一旦找到第一个匹配行,两个查询都将停止处理。正如我在回答中所说,当您使用 EXISTS 子句时,Oracle 知道它可以在返回一行后立即停止评估 EXISTS 子句中的查询。
  • @picheto - dual 是一个特殊的表(或伪表),它始终存在并且始终只有一行。
【解决方案2】:

怎么样:

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

【讨论】:

    【解决方案3】:

    既然您要求 sql 查询应该返回 1 或 0,那么您可以尝试以下查询:-

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

    由于上面的查询使用了 Exists,所以它会扫描员工表,一旦遇到 name 匹配“kaushik”的第一条记录,它就会返回 1(不扫描表的其余部分)。如果没有记录匹配,则返回 0。

    【讨论】:

    • 据我了解,内部查询将首先扫描员工的所有记录并返回一个临时表。然后外部查询将运行以检查内部查询是否返回任何内容?我对吗 ?或者“Exists”子句的行为不同。
    • nope...exists 子句的行为不同....内部查询将首先运行,一旦找到employee 表中的第一个匹配项,它将返回(无需进一步扫描)然后外部查询将运行...
    • 你能给我任何解释 Exists 子句的 Oracle 文档链接吗?这样我就可以确认上面的解释了。
    【解决方案4】:
    select 1 
     where exists ( select name 
                      from employee 
                      where name like 'kaushik%'
                   )
    

    【讨论】:

    • 我假设你的意思是在 select 1 之后有一个 from dual
    • 很抱歉我没有......我什至不知道这意味着什么 2 b 诚实
    • Oracle 在每个 SQL 语句中都需要一个 FROM 子句。不像 Postgres,其中 select 1; 是一个完全有效的语句。
    • alrite。我只是以 SQL 的方式表示,当您找到第一条记录时停止查找 n 在发布之前在 SQL Server 上测试了该语句。对此我很抱歉,没有接触过 Oracle ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多