web-dev-qa-db-ja.com

特定の条件を持つ行が少なくとも1つ存在するかどうかを識別します

従業員表にはID列とNAME列があります。名前は繰り返すことができます。 「kaushik%」などの名前の行が少なくとも1つあるかどうかを確認します。

したがって、クエリは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
24
Kaushik Lele

一般的に、あなたはこれを

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は最初に一致する行を見つけるとすぐに検索を停止できます。

最初のアプローチはもう少しコンパクトですが、私の目には、何かを数えようとするのではなく、特定の行が存在するかどうかを本当に調べたいので、2番目のアプローチはもう少し明確です。しかし、最初のアプローチも非常に簡単に理解できます。

36
Justin Cave

どうですか:

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
5
Gordon Linoff

sqlクエリが1または0を返す必要があるため、次のクエリを試すことができます。

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

上記のクエリはExistsを使用しているため、従業員テーブルをスキャンし、名前が「kaushik」に一致する最初のレコードを検出するとすぐに1を返します(テーブルの残りをスキャンせずに)。どのレコードも一致しない場合、0を返します。

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