Набор значений в pl / pgsql - PullRequest
       9

Набор значений в pl / pgsql

2 голосов
/ 17 августа 2011

Я пишу некоторый код pl / pgsql в postgres - и подошел к этой проблеме.Упрощенно, мой код выглядит так:

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

Однако это не кажется мне слишком эффективным, когда число идентификаторов, добавляемых в этот набор, велико.Какие еще есть варианты для отслеживания этого набора и последующего его использования?

- update -

Очевидно, что другим вариантом является создание временной таблицы и вставка в нее идентификаторов, когданеобходимо.Затем в последнем операторе выбора есть дополнительный выбор для этой временной таблицы - например, так:

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);

Есть ли другие варианты?Кроме того, что будет наиболее эффективным, учитывая, что может быть много тысяч соответствующих идентификаторов.

1 Ответ

0 голосов
/ 17 августа 2011

На мой взгляд, временные таблицы - самый эффективный способ справиться с этим:

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