web-dev-qa-db-ja.com

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$
17
user3824666

返された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$
9
Clodoaldo Neto

丸括弧で囲むだけです。

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

受け入れられた答えは複雑すぎると思います。これが私の自己記述的な例です。

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
0
SalientBrain