使用视图列表的 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;
如果需要一个新的视图作为源,只需调整合并所有其他视图的视图即可。
我想做 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;
如果需要一个新的视图作为源,只需调整合并所有其他视图的视图即可。