33

従業員テーブルには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
4

4 に答える 4

40

通常、これは次のように表現します。

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 番目のアプローチはもう少し明確です。しかし、最初のアプローチも非常に理解しやすいものです。

于 2013-01-28T16:55:35.500 に答える
8

どうですか:

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
于 2013-01-28T16:50:16.187 に答える
3

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

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

上記のクエリは Exists を使用しているため、employee テーブルをスキャンし、名前が "kaushik" と一致する最初のレコードに遭遇するとすぐに 1 を返します (テーブルの残りはスキャンしません)。一致するレコードがない場合は、0 が返されます。

于 2013-01-28T17:07:50.467 に答える
0
select 1 
 where exists ( select name 
                  from employee 
                  where name like 'kaushik%'
               )
于 2013-01-28T16:52:24.237 に答える