sql - PostgreSQL:如果条件存在则选择所有具有条件的行,否则忽略条件并选择最早的行

标签 sql postgresql common-table-expression

我有一个 PostgreSQL 函数 find_all_records_with_params() 返回一个 SETOF 记录。记录表包含以下列:

table records(
id integer,
type integer,
created date,
content text
);

我想选择 current_date - created 大于 90 天的所有记录。但是,如果此查询不存在,我想选择 1 条具有最早 created 日期的记录。

我尝试使用递归 cte(如下所示)来执行此操作,但它不允许使用 if/else 逻辑。我试图避免两次调用 find_all_records_with_params() 函数,并且我不希望尽可能创建临时表。

with most_records as (select * from find_all_records_with_params()),
filtered_records as (select * from most_records where current_date - created > 90)
if exists(select * from filtered_records) then
select * from filtered_records;
else
select * from most_records order by created asc limit 1;
end if;

最佳答案

with most_records as (select * from find_all_records_with_params()),
filtered_records as (select * from most_records where current_date - created > 90)
select * from filtered_records
union 
select * from 
(select * from most_records 
where not exists (select * from filtered_records limit 1) 
order by created asc limit 1 ) a ;

我已经使用联合查询来实现您需要的结果。如果您的 filtered_records 返回结果,则联合后的查询将不会产生任何结果,否则联合产生结果后的查询。

关于sql - PostgreSQL:如果条件存在则选择所有具有条件的行,否则忽略条件并选择最早的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44186456/

相关文章:

sql - PostgreSQL 查询中的挑战(分组依据和有问题)

sql - SQL 中的事务和回滚

mysql - 在 Rails 中限制字符串属性的大小是否会使数据库变得更小?

mysql - 存储过程返回错误值?

postgresql - 窗口函数和更多 "local"聚合

sql-server - 为什么 Transact-SQL 中的递归 CTE 需要 UNION ALL 而不是 UNION?

sql - 使用 CTE 插入雪花

mysql - 在 MySQL 中选择多个值作为数组

java - Hibernate 中返回列表中一些聚合结果的条件

sql - 如何在 PostgreSQL ORDER BY 子句中使用别名?