J'ai une requête comme celle-ci: normalement, cette requête doit renvoyer exactement une ligne. Quand il n'y a pas de correspondance sur Je sais que je [em> pourrait em> manipuler cela dans pl / sql , mais je me demandais s'il y a un moyen de le faire seulement dans une requête. Comme test, j'ai essayé: p> ... Mais cela ne fonctionnera évidemment pas (car (Oracle 10G) P> P> v_t_id code>, le programme échoue avec une exception "Aucune donnée trouvée". P> subq code> étant vide n'est pas le même que subq.data_name est null code>). Est-ce même possible ou devrais-je simplement vérifier ma solution PL / SQL? P>
6 Réponses :
Si vous attendez toujours zéro ou une ligne, vous pouvez utiliser une fonction de groupe IE:
select dump(max(dummy)) from dual where dummy = 'Not Found'
Je préférerais gérer l'exception. Cependant, cela fonctionnerait comme vous spécifiez: Notez que cela "fonctionne" aussi "fonctionne" si la requête renvoie
select coalesce(data_table.data_name, d.data_name) data_name
into v_name
from
(SELECT 'UNKNOWN ' as data_name FROM DUAL) d
LEFT JOIN data_table
ON data_table.type = v_t_id
or a.data_table.data_name is null
Il y a des moyens de rendre cela plus simple et plus propre, mais ceci épelait essentiellement la technique: Lorsque la première partie de l'Union est vide, la seconde contiendra une rangée, quand la première La pièce n'est pas vide, la seconde ne contiendra pas de lignes. P> Si la requête prend beaucoup de temps, utilisez celui-ci: P> SELECT * FROM (
SELECT data_name
FROM data_table
WHERE data_table.type = v_t_id
UNION ALL
SELECT NULL AS data_name
FROM dual
) WHERE data_name is not null or ROWNUM = 1
J'aime celui-ci, le n'existe pas code> rend la signification du tout très clair.
https://stackoverflow.com/a/4683045/471149 La réponse est sympa, mais il y a une solution plus courte < Pré> xxx pré> p>
Voici ma solution simple en utilisant la jointure extérieure gauche:
Quelle valeur attendez-vous / souhaitez-vous avoir si la requête ne renvoie aucune ligne de lignes? C'est le défi de traiter avec une condition de données sans données.
@Thomas: la chaîne "inconnue" fonctionnerait bien dans ce scénario.