2009-11-12 6 views
5

Est-il possible dans Oracle SQL de retourner une ligne par défaut si aucune ligne n'a été trouvée. J'ai un processus où les lignes récupérées seront placées dans un fichier ASCII plat. maintenant j'ai une exigence que s'il n'y a pas de lignes récupérées par la requête sql alors il devrait y avoir une ligne par défaut dans le fichier ASCII.Renvoyer une ligne par défaut en SQL

est-il possible en sql de sortir une ligne par défaut si aucune ligne n'a été lue par la requête note: je ne veux pas utiliser pl/sql.

Répondre

6

Vous pouvez utiliser UNION ALL pour cela:

select a, b, c from foobar 
where foo='FOO' 
union all 
select 'def', 'ault', 'value' from dual 
where not exists (select 'x' from foobar where foo='FOO') 
+0

excellents answer.thanks ammoQ – Vijay

2

Je pense qu'il serait plus propre d'avoir le processus que les écritures du fichier ASCII écrire les données par défaut si aucune ligne sont renvoyés plutôt que d'obtenir Oracle fais le. Si la requête que vous utilisez est coûteuse, vous augmenteriez considérablement ce coût si vous la trafiquez pour retourner une ligne par défaut, comme l'ont fait ammoQ et David Oniell.

6

Pour les requêtes complexes où les frais généraux sur la recherche de savoir s'il y a une ligne dans le jeu de résultats est onéreux ou la requête est juste très grande et peu maniable, puis une clause d'affacturage de sous-requête peut être bénéfique:

With my_query as 
    (
    select a, b, c from foobar where foo='FOO' 
    ) 
Select a,b,c 
From my_query 
Union All 
Select ... 
From dual 
Where Not Exists 
     (Select 1 from my_query) 
/
+0

belle, je ne l'ai jamais vu avant que – ninesided

+1

+1 pour la clause avec –

+0

si my_query utilise des expressions de groupe? Comment les utiliser en 5ème rangée? – zygimantus

1

Il y a une autre option (triste, tordue). Aucun CTE ou répétition de sous-requête nécessaire.

select 
    coalesce(a, 'def'), 
    coalesce(b, 'ault'), 
    coalesce(c, 'value') 
from foobar 
right join (select 1 from dual) on 1=1 
where foobar.some_condition; 
+0

qu'est-ce que 'dual'? –

+0

@ AlbertoAcuña "dual" est une convention étrange unique à Oracle représentant une table virtuelle à partir de laquelle les constantes sont sélectionnées. – Reinderien

Questions connexes