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

时间:2014-07-22 08:05:23

标签: postgresql plpgsql

我有一张桌子" UserState"包含以下字段: ID, 用户身份, 的ctime, 州, 时间结束。 我有一个简单的查询:

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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

将返回的user_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$

答案 1 :(得分:0)

我认为接受的答案过于复杂 这是我的自我描述性示例:

with p as
(
    select id, xyz geometry from insar1.point
)
, extent as
(
    select st_extent(st_force2d(geometry)) geometry from p
)
INSERT INTO insar1.grid (geometry)
SELECT (
    ST_Dump(
      makegrid_2d(
        --maybe you need limit 1
        (SELECT e.geometry from extent e), --just use braces
        --this works too:
        --(ARRAY(SELECT e.geometry from extent e))[1],
         100,
         100
       )
    )
  ) .geom geometry

答案 2 :(得分:0)

只需用圆括号括起来:

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

答案 3 :(得分:0)

在我的情况下,我像下面这样使用properties: { selected_contents: { bsonType: 'array' items: { bsonType: 'int' } } } 语句的结果。

SELECT