2013-04-12 90 views
1

我使用Postgres从表中获取结果。我想用SQL来解决问题。在SQL中:当查询返回“无结果”时显示一些默认结果

当我的postgresql查询返回没有结果时,我想要出现一些默认的行结果。我正在使用Jasper报告,因此我没有很多工具来捕捉没有结果的事件,然后提供默认结果。

当第一个查询确实显示结果时,我不希望显示默认结果。目前我正在尝试使用UNION,但我希望Union命令之后的第二个查询仅在第一个查询显示0个结果时发生。

这可以在SQL中完成吗?

+0

的原因,我想这样做是因为我用的JasperSoft的iReport的报告,我无法得到我所需要使用该程序来完成。所以我试图诉诸SQL来满足我的需求。 @EricLeschinski – precose

+0

您是检索单行还是多行? –

回答

3

你可以尝试CTE:

with fooresults as 
(
select c1, c2 from foo 
) 

select c1, c2 from fooresults 
union 
select c1, c2 from blah 
where (select count(*) from fooresults)=0 

或者你可以测试空fooresults不计数:

where not exists (select 1 from fooresults) 

PS当然,你可以添加,当你实例化CTE所需的所有条件:

 select c1, c2 from foo where .... <some conditions> 
2
SELECT * 
FROM table1 
UNION ALL 
SELECT * 
FROM table2 
WHERE 0 = (
    SELECT count(table1.id) 
    FROM Table1 
    GROUP BY table1.id) 

乘头,感觉虽然难看......

3

不要做一个count检查行的存在,因为它会计算整个表。在改用exists

select c1, c2, c3 
from t 
union 
select 1, 2, 3 
where not exists (select * from t) 
+1

+1在性能方面比我的回答好。 –

+1

+1是第一个建议不存在的。 –

+1

@Erwin我很高兴有人承认它。 –