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

hai*_*ham 0 sql postgresql common-table-expression

我有一个 PostgreSQL 函数find_all_records_with_params(),它返回一个SETOF records. 记录表具有以下列:

table records(
id integer,
type integer,
created date,
content text
);
Run Code Online (Sandbox Code Playgroud)

我想选择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;
Run Code Online (Sandbox Code Playgroud)

Fah*_*jum 5

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 ;
Run Code Online (Sandbox Code Playgroud)

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

  • 在where not contains (子查询限制1)中,这里使用limit来减少执行时间。因为我们只需要检查过滤后的记录中是否有记录。 (2认同)