我试图创建一个返回数据表的函数。我遇到的问题是,我希望根据加入表的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
有一种简单的方法可以解决这个问题吗?
谢谢!
答案 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;