web-dev-qa-db-fra.com

Identifier s'il existe au moins une ligne avec une condition donnée

La table des employés comporte des colonnes ID et NAME. Les noms peuvent être répétés. Je veux savoir s'il y a au moins une ligne avec un nom comme 'kaushik%'.

La requête doit donc renvoyer true/false ou 1/0.

Est-il possible de le trouver en utilisant une seule requête. Si nous essayons quelque chose comme

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

dans ce cas, il ne renvoie pas vrai/faux. Nous parcourons également tous les enregistrements du tableau. Existe-t-il un moyen dans SQL simple de sorte que chaque fois que le premier enregistrement qui satisfait la condition est récupéré, il devrait cesser de vérifier d'autres enregistrements. Ou une telle chose ne peut être gérée que dans le bloc Pl/SQL?

EDIT * La première approche fournie par Justin semble bonne réponse

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

Généralement, vous exprimeriez cela soit

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

où le rownum = 1 le prédicat permet à Oracle de cesser de chercher dès qu'il trouve la première ligne correspondante ou

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

où la clause EXISTS permet à Oracle d'arrêter la recherche dès qu'il trouve la première ligne correspondante.

La première approche est un peu plus compacte mais, à mon avis, la deuxième approche est un peu plus claire car vous cherchez vraiment à déterminer si une ligne particulière existe plutôt que d'essayer de compter quelque chose. Mais la première approche est également assez facile à comprendre.

36
Justin Cave

Que diriez-vous:

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

Ou, ce qui pourrait être plus efficace puisque like peut utiliser des index:

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

puisque vous avez besoin que la requête sql retourne 1 ou 0, alors vous pouvez essayer la requête suivante: -

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

Étant donné que la requête ci-dessus utilise Exists, elle analysera la table des employés et dès qu'elle rencontrera le premier enregistrement dont le nom correspond à "kaushik", elle renverra 1 (sans analyser le reste de la table). Si aucun des enregistrements ne correspond, il renvoie 0.

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