我Postgres
用来从表中获取结果。我想用 SQL 来解决一个问题。
当我的 postgresql 查询没有返回结果时,我希望出现一些默认的行结果。我正在使用 Jasper-reports,所以我没有很多工具来捕捉没有结果的事件,然后提供默认结果。
当第一个查询显示结果时,我不希望出现默认结果。目前我正在尝试使用 UNION 但我希望Union
命令之后的第二个查询仅在第一个查询显示 0 结果时发生。
这可以在 SQL 中完成吗?
我Postgres
用来从表中获取结果。我想用 SQL 来解决一个问题。
当我的 postgresql 查询没有返回结果时,我希望出现一些默认的行结果。我正在使用 Jasper-reports,所以我没有很多工具来捕捉没有结果的事件,然后提供默认结果。
当第一个查询显示结果时,我不希望出现默认结果。目前我正在尝试使用 UNION 但我希望Union
命令之后的第二个查询仅在第一个查询显示 0 结果时发生。
这可以在 SQL 中完成吗?
您可以尝试 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>
不要count
检查行的存在,因为它会计算整个表。相反,使用exists
select c1, c2, c3
from t
union
select 1, 2, 3
where not exists (select * from t)
SELECT *
FROM table1
UNION ALL
SELECT *
FROM table2
WHERE 0 = (
SELECT count(table1.id)
FROM Table1
GROUP BY table1.id)
从头上看,虽然感觉很丑...