从Postgres中的generate_series结果创建列

时间:2016-08-15 19:38:50

标签: postgresql plpgsql

我觉得这应该非常简单,但我似乎无法找到解决方案。

我正在尝试创建一个plpgsql函数,该函数将开始日期和结束日期作为输入,然后生成两个日期之间的一系列年份,我可以将其用作新表的列。

例如,如果我打电话

my_function('2010-01-01', '2015-01-1')

我想要一个包含2010,2011,2012,2013,2014和2015列的新表。

我倾向于使用generate_series()函数来执行此操作,但我无法弄清楚如何实际存储它返回的值并将其拉出以创建我的表。

我使用的是Postgres 9.5.3

1 个答案:

答案 0 :(得分:1)

将动态sql与execute format一起使用。

假设新表应该有文本列:

create or replace function create_table(table_name text, from_year int, to_year int)
returns void language plpgsql as $$
begin
    execute format('create table %I(%s)', 
        table_name, 
        string_agg(concat('"', y::text, '" text'), ',')) 
    from generate_series(from_year, to_year) y;
end $$;

select create_table('my_table', 2010, 2015);

\d my_table

  Table "public.my_table"
 Column | Type | Modifiers 
--------+------+-----------
 2010   | text | 
 2011   | text | 
 2012   | text | 
 2013   | text | 
 2014   | text | 
 2015   | text |