将 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

将'select from dual'作为参数传递给java可调用语句

将表达式参数作为参数传递给另一个表达式

Delphi:如何将列表作为参数传递给SQL查询?

将查询作为参数传递给 udf 函数

Excel VBA:将计算结果数组作为参数传递给函数

Python - 将数字作为参数传递给文件名