如果没有找到行,oracle sql是否可以返回默认行。 我有一个进程,其中获取的行将放在一个平坦的ascii文件中。 现在我要求如果sql查询没有提取任何行,那么ascii文件中应该有一个默认行。
如果查询没有提取任何行,sql中是否可以输出默认行 注意:我不想使用pl / sql。
答案 0 :(得分: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' )
答案 1 :(得分: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)
/
答案 2 :(得分:2)
我怀疑,如果没有返回行而不是让Oracle执行,那么写入ASCII文件写入默认数据的过程会更清晰。如果你使用的查询很昂贵,如果你捏造它以ammoQ和David Oniell的形式返回默认行,你就会大大增加这个成本。
答案 3 :(得分: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;