我在postgres中编写了一些pl/pgsql代码,并解决了这个问题。简化后,我的代码如下所示:

declare
    resulter     mytype%rowtype;

...

for resulter in
    select id, [a lot of other fields]
    from mytable [joining a lot of other tables]
    where [some reasonable where clause]
loop
    if [certain condition on the resulter] then
        [add id to a set];
    end if;
    return next resulter;
end loop;

select into myvar sum([some field])
from anothertable
where id in ([my set from above])

问题是关于[添加到集合]。在过去的另一个场景中,我曾经这样处理:
declare
    myset    varchar := '';

...

loop
    if [condition] then
        myset || ',' || id;
    end if;
    return next resulter;
end loop;

execute 'select sum([field]) from anothertable where id in (' || trim(leading ',' from myset) || ')' into myvar

但是,当要添加到这个集合的id的数目很大时,这对我来说似乎不是太有效。我还有什么其他的选择来跟踪这个集合然后使用它?
--更新--
显然,另一个选项是创建一个临时表,并在需要时向其中插入id。然后在最后一条select语句中,在该临时表上有一个子select,如下所示:
create temporary table x (id integer);

loop
    if [condition] then
        insert into x values (id);
    end if;
    return next resulter;
end loop;

select into myvar sum([field]) from anothertable where id in (select id from x);

还有其他选择吗?另外,考虑到可能有成千上万的相关身份证,什么样的方法最有效呢。

最佳答案

在我看来,临时表是处理此问题的最有效方法:

create temp table x(id integer not null primary key) on commit drop;

关于postgresql - pl/pgsql中的一组值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7094654/

10-16 16:50