9
votes

Oracle: Obtenez une requête pour toujours retourner exactement une ligne, même s'il n'y a pas de données à trouver

J'ai une requête comme celle-ci: xxx

normalement, cette requête doit renvoyer exactement une ligne. Quand il n'y a pas de correspondance sur v_t_id , le programme échoue avec une exception "Aucune donnée trouvée".

Je sais que je [em> pourrait 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é: xxx

... Mais cela ne fonctionnera évidemment pas (car subq étant vide n'est pas le même que subq.data_name est null ). Est-ce même possible ou devrais-je simplement vérifier ma solution PL / SQL?

(Oracle 10G)


2 commentaires

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.


6 Réponses :


0
votes

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'


0 commentaires

9
votes

Je préférerais gérer l'exception. Cependant, cela fonctionnerait comme vous spécifiez: xxx

Notez que cela "fonctionne" aussi "fonctionne" si la requête renvoie plus d'une ligne - c'est-à-dire trop_many_rows n'est pas soulevée. < / p>


0 commentaires

1
votes
 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

0 commentaires

21
votes

Il y a des moyens de rendre cela plus simple et plus propre, mais ceci épelait essentiellement la technique: xxx pré>

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


1 commentaires

J'aime celui-ci, le n'existe pas rend la signification du tout très clair.



0
votes

https://stackoverflow.com/a/4683045/471149 La réponse est sympa, mais il y a une solution plus courte < Pré> xxx


0 commentaires

1
votes

Voici ma solution simple en utilisant la jointure extérieure gauche: xxx


0 commentaires