使用动态SQL在列表中创建对象

时间:2018-06-06 13:05:03

标签: postgresql

我有以下代码,其中包含频道列表:

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;

(1) - https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

2 个答案:

答案 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