将SELECT结果作为参数传递给postgreSQL函数

use*_*666 13 postgresql plpgsql

我有一个表"UserState",其中包含以下字段:id,userid,ctime,state,endtime.我有一个简单的查询:

SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
Run Code Online (Sandbox Code Playgroud)

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

get_timeinstate(SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp);
Run Code Online (Sandbox Code Playgroud)

如何正确创建函数以将查询结果作为参数传递给那里?有必要理解,该函数返回另一个SQL结果,我需要在那里使用"IN"条件:

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

MrR*_*MrR 9

只需用圆括号括起来:

get_timeinstate(
  (
    SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
  )
);
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案,很清楚,但是你能解释一下为什么那对额外的括号会产生如此巨大的差异吗? (3认同)

Clo*_*eto 7

将返回的user_id设置为数组.创建接受整数数组的函数

create function get_timeinstate (
    user_id_set integer[],
    another_param...
Run Code Online (Sandbox Code Playgroud)

然后调用它传递生成的数组 array_agg

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

功能内部:

where "UserState".userid = any (user_id_set)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你使用的是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$
Run Code Online (Sandbox Code Playgroud)