2009-11-12 61 views
5

如果没有找到行,oracle sql中是否有可能返回默认行? 我有一个过程,在取得的行中将被放在一个平坦的ascii文件。 现在我有一个要求,如果没有行被sql查询读取,那么应该有一个默认的行在ascii文件中。返回sql中的缺省行

是否有可能在sql中输出默认行,如果查询没有提取行 注意:我不想使用pl/sql。

回答

6

你可以使用UNION ALL这个:

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 2009-11-12 13:58:03

2

我怀疑,这将是清洁剂具有与写入的ASCII文件写入默认的数据,如果没有行返回,而不是让甲骨文的过程做到这一点。如果您使用的查询代价昂贵,则如果您将其作为ammoQ和David Oniell完成的操作返回默认行,则会显着增加此成本。

6

对于复杂的查询,其中上找出是否有在结果集中的某一行的开销是繁重或查询仅仅是非常大而笨重,然后一个子查询分解条款可能是有益的:

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

不错,我从来没有看到 – ninesided 2009-11-12 17:09:37

+1

+1为与第 – 2009-11-12 18:10:52

+0

如果什么my_query使用组表达过吗?如何在第五排使用它们? – zygimantus 2016-10-27 07:09:27

1

还有另一个(悲伤,扭曲)选项。不需要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

什么是'双'? – 2017-01-02 14:08:23

+0

@AlbertoAcuña“dual”是Oracle特有的一个奇怪的约定,表示从中选择常量的虚拟表。 – Reinderien 2017-01-02 14:10:33