动态创建列名postgresql

时间:2016-10-06 19:05:16

标签: sql postgresql stored-procedures plpgsql

我试图创建一个返回数据表的函数。我遇到的问题是,我希望根据加入表的Date列中的年份来动态创建一些列。

例如,如果记录的date字段的年份为“2016”,那么我想要2016年' 2016年'与'subdepartment_name _'连接?在SELECT查询中创建列名。

以下是我到目前为止所写的内容。

CREATE OR REPLACE FUNCTION sample_function ()
RETURNS TABLE(subdepartment_name text,
              subdepartment_number text,
              department_number text,
              department_name text,
              my_column1 text,
              my_column2 text) AS
$$
DECLARE
    year TEXT;
BEGIN
  year := date_part('year'::text, table1.date);
  RETURN QUERY
    EXECUTE 'SELECT table2.subdepartment_number_'||year||
            ',table2.subdepartment_name_'||year||
            ',table2.department_number_'||year||
            ',table2.department_name_'||year||
            ',table1.*
            FROM
               table1
            LEFT JOIN
               table2
            ON
               table1.team = table2.team_number;';
END;
$$
  LANGUAGE plpgsql VOLATILE;

SELECT * FROM sample_function()运行此功能时出现此错误:

ERROR:  missing FROM-clause entry for table "table1"
LINE 1: SELECT date_part('year'::text, table1....
                                       ^
QUERY:  SELECT date_part('year'::text, table1.date)
CONTEXT:  PL/pgSQL function sample_function() line 5 at assignment

********** Error **********

ERROR: missing FROM-clause entry for table "table1"
SQL state: 42P01
Context: PL/pgSQL function sample_function() line 5 at assignment

有一种简单的方法可以解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

作业

year := date_part('year'::text, table1.date);

相当于

year := (select date_part('year'::text, table1.date));

正如您所看到的,查询的table1子句中没有from(因为缺少from子句;)。你应该试试:

year := date_part('year'::text, table1.date) from table1 limit 1;
-- or
year := date_part('year'::text, table1.date) from table1 where id = 1;
-- or something else, the query should return exactly one row

简单赋值需要查询恰好产生一行。 如果您想为一组值执行某些操作,请使用loop,例如:

for year in
    select distinct date_part('year', table1.date) from table1
loop
    -- do something with year
end loop;