Передайте результат SELECT как аргумент функции postgreSQL

У меня есть таблица "UserState" со следующими полями: id, userid, ctime, state, endtime. У меня есть простой запрос:

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$

Ответы

Ответ 1

Передайте возвращаемый набор 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)

BTW, если вы используете 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$

Ответ 2

Я думаю, что принятый ответ слишком сложный. Вот мой самоописательный пример:

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