返回sql中的默认行

返回sql中的默认行,sql,oracle,unix,Sql,Oracle,Unix,在oracle sql中,如果找不到行,是否可以返回默认行。 我有一个过程,在这个过程中,取回的行将放在一个简单的ascii文件中。 现在我有一个要求,如果sql查询没有获取行,那么ascii文件中应该有一个默认行 在sql中,如果查询没有获取行,是否可以输出默认行 注意:我不想使用pl/sql。您可以使用UNION ALL来实现以下目的: select a, b, c from foobar where foo='FOO' union all select 'def', 'ault', 'v

在oracle sql中,如果找不到行,是否可以返回默认行。 我有一个过程,在这个过程中,取回的行将放在一个简单的ascii文件中。 现在我有一个要求,如果sql查询没有获取行,那么ascii文件中应该有一个默认行

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

您可以使用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' )

我怀疑,如果没有返回行,那么让写入ASCII文件的进程写入默认数据,而不是让Oracle这样做,会更干净。如果您正在使用的查询很昂贵,那么如果您像ammoQ和David Oniell所做的那样伪造它以返回默认行,则会显著增加该成本。

对于复杂的查询,查找结果集中是否有行的开销是繁重的,或者查询非常大且笨拙,那么子查询factoring子句可能是有益的:

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

很好,我以前从未见过,如果我的查询使用组表达式呢?如何在第五行使用它们?什么是“dual”?@AlbertoAcuña“dual”是Oracle特有的一种奇怪的约定,表示从中选择常量的虚拟表。