2009-11-12 2 views
5

行が見つからない場合、oracle sqlでデフォルト行を戻すことは可能ですか? フェッチされた行をフラットなasciiファイルに入れるプロセスがあります。 今私は、SQLクエリによってフェッチされた行がない場合、asciiファイルにデフォルト行があるはずです。SQLでデフォルトの行を返します

クエリでフェッチされた行がない場合、sqlでデフォルトの行を出力することができます。 注:pl/sqlを使用したくありません。

答えて

6

あなたはこのためにUNION ALLを使用することができます。私は何行がむしろにオラクルを得るよりも返されない場合は書き込みASCIIファイルは、デフォルトのデータを書き込むプロセスを持っているきれいだろうと思われる

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

優れたanswer.thanks素敵ammoQ – Vijay

2

それをやる。あなたが使用しているクエリが高価な場合、ammoQとDavid Oniellが行ったようにデフォルトの行を返すようにファジーすると、そのコストが大幅に増加します。

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) 
/
6

別の(悲しい、ねじれた)オプションがあります。 CTEまたはサブクエリの繰り返しは必要ありません。

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

、私は句 – ninesided

+1

前my_queryは、グループ式を使用している場合、どのようなことを見たことがありませんか?どのように5行目でそれらを使用するには? –

+0

持つため1 – zygimantus

1

:行が結果セットに存在するかどうかを見つけることにオーバーヘッドが不利であるか、またはクエリが単に非常に大きくて扱いにくく、次いでサブクエリファクタリング句は有益かもしれない複雑なクエリについて

+0

「デュアル」とは何ですか? –

+0

@AlbertoAcuña "dual"は、定数が選択される仮想テーブルを表すOracle固有の奇妙な規則です。 – Reinderien