使用日期作为用户指定范围内的列标题进行查询

时间:2014-05-14 09:02:57

标签: sql postgresql crosstab

我试图在Postgres 9.1中生成一个查询,根据需要生成尽可能多的列以适应日期范围。下面的函数生成我需要的SQL字符串,但是我不能执行函数返回的SQL。 结果需要看起来像单个(或将来多个)描述符列,然后是构成日期范围所需的尽可能多的列。这些字段的标题将是日期,而这些字段的记录内容将是文本。

我不确定我是否采用这种方法走上正轨,所以如果有更简单的方法,那么我更愿意接受它。任何帮助将不胜感激。

CREATE OR REPLACE FUNCTION admin."TV_EmpStatusSQL_func" (
  "StartDate" date = 'now'::text::date,
  "EndDate" date = 'now'::text::date + 7
)
RETURNS text AS
$body$
DECLARE
  dateval DATE;
  sqlstring TEXT;
  StartDate ALIAS FOR $1;
  EndDate ALIAS FOR $2;
BEGIN

sqlstring := 'SELECT admin."HR_Employees_view"."EmployeeName"';
dateval := StartDate;

WHILE dateval <= EndDate LOOP
sqlstring := sqlstring || ', admin."TV_WhereIsEmployee_func"(admin."HR_Employees_view"."HRE_ID",     ''' || dateval || ''') AS "' || dateval || '"';
dateval := dateval + 1;
END LOOP;
sqlstring := sqlstring || ' FROM admin."HR_Employees_view";';
RETURN sqlstring;
END;
$body$
LANGUAGE 'plpgsql'
STABLE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

1 个答案:

答案 0 :(得分:1)

在plpgslql函数中使用execute来执行动态sql

execute sqlstring;

http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN