使用视图列表的 PostgreSQL for 循环?

PostgreSQL for loop using the list of views?

我想做 for loop,这会 insert into from select。目标 table 始终相同,但源视图不同。我想遍历视图列表(结构相同)并进行插入。

我会在 Python 中做类似的事情(只是我想要实现的示例,我 want/need PostgreSQL 解决方案,而不是 Py)

list = ["view_1", "view_2","view_3"]
for l in list:
    insert into table_1 (col1, col2) select col1, col2 from l

我知道 Postgres 中没有列表对象,但是可以使用数组,对吗?

任何 suggestion/examples 如何做到这一点?

为此您需要使用动态 SQL。对于 one-time 事物,您可以使用 DO 块:

do
$$
declare
  l_views text := array['view_1', 'view_2', 'view_3'];
  l_view  text;
  l_sql   text;
begin
  foreach l_view in l_views 
  loop
    l_sql := format('insert into table_1 (col1, col2) select col1, col2 from %I', l_view);
    execute l_sql;
  end loop;
end;
$$;

如果您更频繁地需要它,您可以将其放入存储过程中。

另一种选择是创建一个合并所有视图的附加视图:

create view all_views
as
select col1, col2
from view_1
union all
select col1, col2
from view_2
union all
select col1, col2
from view_3;

那么你不需要动态 SQL 或循环:

insert into table_1 (col1, col2)
select col1, col2
from all_views;

如果需要一个新的视图作为源,只需调整合并所有其他视图的视图即可。