Я пишу некоторый код 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);
Есть ли другие варианты?Кроме того, что будет наиболее эффективным, учитывая, что может быть много тысяч соответствующих идентификаторов.