次のフィールドを持つテーブル「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$
返された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$
丸括弧で囲むだけです。
get_timeinstate(
(
SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
)
);
受け入れられた答えは複雑すぎると思います。これが私の自己記述的な例です。
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