4

Postgres用来从表中获取结果。我想用 SQL 来解决一个问题。

当我的 postgresql 查询没有返回结果时,我希望出现一些默认的行结果。我正在使用 Jasper-reports,所以我没有很多工具来捕捉没有结果的事件,然后提供默认结果。

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

这可以在 SQL 中完成吗?

4

3 回答 3

7

您可以尝试 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>
于 2013-04-12T13:24:39.390 回答
4

不要count检查行的存在,因为它会计算整个表。相反,使用exists

select c1, c2, c3
from t
union
select 1, 2, 3
where not exists (select * from t)
于 2013-04-12T13:30:30.517 回答
2
SELECT * 
FROM table1
UNION ALL
SELECT *
FROM table2
WHERE 0 = (
   SELECT count(table1.id)
   FROM Table1
   GROUP BY table1.id)

从头上看,虽然感觉很丑...

于 2013-04-12T13:22:29.700 回答