従業員表には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
一般的に、あなたはこれを
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番目のアプローチはもう少し明確です。しかし、最初のアプローチも非常に簡単に理解できます。
どうですか:
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
sqlクエリが1または0を返す必要があるため、次のクエリを試すことができます。
select count(1) from dual
where exists(SELECT 1
FROM employee
WHERE name like 'kaushik%')
上記のクエリはExistsを使用しているため、従業員テーブルをスキャンし、名前が「kaushik」に一致する最初のレコードを検出するとすぐに1を返します(テーブルの残りをスキャンせずに)。どのレコードも一致しない場合、0を返します。
select 1
where exists ( select name
from employee
where name like 'kaushik%'
)