将 SELECT 结果作为参数传递给 postgreSQL 函数
Posted
技术标签:
【中文标题】将 SELECT 结果作为参数传递给 postgreSQL 函数【英文标题】:Pass a SELECT result as an argument to postgreSQL function 【发布时间】:2014-07-22 08:05:22 【问题描述】:我有一个包含以下字段的表“UserState”: ID, 用户身份, 时间, 状态, 时间结束。 我有一个简单的查询:
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$
【问题讨论】:
***.com/questions/18219991/… 听起来你在找LATERAL
:postgresql.org/docs/current/static/sql-select.html
【参考方案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)
顺便说一句,如果您使用的是 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$
【讨论】:
不,我不能,因为我有大约 30 个函数并且只有一个查询,必须将其作为参数传递给所有函数。将查询结果作为参数传递,我将只能执行 1 次。在函数中使用这个查询我会执行 30 次。我需要更少的时间消耗。 @user3824666 函数会一次性使用吗?如果不是,您将传递旧数据(作为 int 数组userid::int[]
,这就是解决方案)。还是可以传递旧数据?否则,如果目的是不重复自己,则将该查询本身作为函数并将date
作为参数传递。
这些函数将立即使用,但我不明白如何使用数组。 SELECTing 时我无法使用 IN 运算符,但我需要它。我不敢相信,不可能将列作为参数传递。
@user3824666 可以传递列值。除了数组形式之外,不能传递一组值。我会发布如何。
我在这里缺少什么? my answer below 有什么问题。【参考方案2】:
只需用圆括号括起来:
get_timeinstate(
(
SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
)
);
【讨论】:
最好的答案,很明显,但是你能解释一下为什么那对额外的括号会产生如此巨大的差异吗?【参考方案3】:在我的例子中,我使用如下方式传递SELECT
语句的结果。
SELECT get_timeinstate(userid) FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
【讨论】:
【参考方案4】:我认为接受的答案过于复杂 这是我的自我描述示例:
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
【讨论】:
以上是关于将 SELECT 结果作为参数传递给 postgreSQL 函数的主要内容,如果未能解决你的问题,请参考以下文章