我有以下代码,其中包含频道列表:
create temporary table channels
(
name text null
);
insert into channels (name) values ('telcom');
insert into channels (name) values ('agro');
insert into channels (name) values ('sports');
insert into channels (name) values ('country');
insert into channels (name) values ('video');
我正在检查PostgreSQL(1)中的动态命令文档,以找到使用channels表列的每个元素创建对象(在本例中为视图)的一些方法。
类似于:wv_telcom,vw_agro,vw_sports,vw_country,vw_video。
我从以下代码开始,但我不知道缺少什么:
DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM countries', 'vw_' || variable)
using (select names from countries);
END;
$$ LANGUAGE plpgsql;
答案 0 :(得分:1)
您需要一个循环,因为您想为每个值创建一个VIEW(而不是表格):
DO
$$
declare
l_rec record;
BEGIN
for l_rec in select names from countries
EXECUTE format('CREATE VIEW %I AS SELECT * FROM countries WHERE name = %L', 'vw_' || l_rec.names, l_rec.names);
end loop;
END;
$$ LANGUAGE plpgsql;
答案 1 :(得分:0)
您可以使用STRING_AGG
生成SQL脚本:
DO
$$
BEGIN
EXECUTE(SELECT STRING_AGG(format('CREATE VIEW %I AS SELECT * FROM countries;'
,'vw_' || name), CHR(10))
FROM channels);
END;
$$ LANGUAGE plpgsql;
<强> DBFiddle Demo 强>