我有一个带有以下字段的表"UserState":

SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp

我有一个plpgsql函数,它必须把这个查询的结果作为参数:

get_timeinstate(SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp);

如何正确地创建函数以将查询结果作为参数传递到那里?

$func$
BEGIN
 RETURN QUERY
 SELECT 
...myanotherquery...
 WHERE "UserState".userid IN (HERE I NEED TO INSERT MY QUERY RESULT)
END;
$func$

推荐答案

将返回的用户id设置为数组传递.创建接受整数数组的函数

create function get_timeinstate (
    user_id_set integer[],
    another_param...

然后通过array_agg生成的数组调用它

get_timeinstate(
    (
        select array_agg(userid)
        from "UserState"
        where ctime>'2014-07-14'::timestamp
    ),
    another_param
);

在函数内部:

where "UserState".userid = any (user_id_set)

顺便说一句,如果您使用的是plpgsql,您可以将查询放在函数中,只传递日期:

create function get_timeinstate (
    p_ctime timestamp,
    another_param...
$func$
declare
    user_id_set integer[] := (
        select array_agg(userid)
        from "UserState"
        where ctime > p_ctime
    );
begin
    return query
    select 
    ...myanotherquery...
    where "UserState".userid = any (user_id_set)
end;
$func$

Postgresql相关问答推荐

如何在PostgreSQL中以行值的形式获取列

无法在kubernetes中设置postgres复制

在postgres中撤销Select后,RLS停止工作

如何将 jackc/pgx 与连接池、上下文、准备好的语句等一起使用

如何使用 go-pg 包删除所有记录

Postgres 视图定义 (pgAdmin) 被删除了 comments ?

postgres 中的模式前缀,被调用元素的范围

PostgreSQL TIMESTAMPTZ 不适用于 SpringBoot Java Query

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

JPA findBy 字段忽略大小写

PostgreSQL - 我应该如何使用 first_value()?

PostgreSQL:在timestamp::DATE 上创建索引

postgresql查询中的正则表达式不区分大小写

AWS RDS 公开访问

PostgreSQL 中基于时间戳的移动平均线

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

如何在psql中退出查询结果查看器?

如何使用 WITH RECURSIVE 子句进行 Select

Array Push的 Postgres 数组追加和数组长度

性能调优:为布尔列创建索引