所以我每晚都需要生成表。例如,我有一些表,如fooĭjan16、foo jan1016、foo jan1016等。此外,我在每天运行的其他查询中引用这些表。然而,查找和替换似乎效率低下。我想做的是自动化这个过程。我想做的事情是:

    CREATE OR REPLACE FUNCTION table_date() RETURNS text AS $$
            SELECT 'foo_'||to_char(current_timestamp, 'DDMONYY') AS result
    $ LANGUAGE SQL;

那么在查询中我可以引用table_date()?即
    CREATE TABLE table_date() AS
    SELECT * FROM base_table WHERE date <= current_date;

    SELECT * FROM table_date() LIMIT 10;

差不多吧。我正在使用postgreSQL 8.2。
谢谢

最佳答案

不,不能这样做,因为PG需要表名的字符串文字,而不是某个表达式。像往常一样,在PG中有一个工作,在PL/pgSQL函数中有一个动态查询。
首先必须创建表并填充它:

CREATE FUNCTION todays_data() RETURNS void AS $$
BEGIN
  EXECUTE 'CREATE TABLE foo_' || to_char(CURRENT_DATE, 'DDMONYYYY') ||
          ' AS SELECT * FROM base_table WHERE date <= CURRENT_DATE';
END;
$$ LANGUAGE plpgsql;

您应该每天调用此函数一次:SELECT todays_data();
对于查询,您需要使用CURSOR为每个查询创建一个函数。以目前的标准来看,这是相当低效的,但是PG 8.2不支持RETURN NEXT QUERY,这将用一个语句解决下面的函数。所以,困难的是:
CREATE FUNCTION someday_query1(dt date) RETURNS SETOF base_table AS $$
DECLARE
  cur refcursor;
  rec base_table%ROWTYPE;
BEGIN
  OPEN cur FOR EXECUTE 'SELECT * FROM foo_' || to_char(dt, 'DDMONYYYY') ||
                       ' WHERE some_condition';
  FETCH cur INTO rec;
  WHILE FOUND LOOP
    RETURN NEXT rec;
    FETCH cur INTO rec;
  END LOOP;
  CLOSE cur;
END;
$$ LANGUAGE plpgsql STRICT;

然后您可以这样调用查询:
SELECT * FROM someday_query1(CURRENT_DATE);


SELECT * FROM someday_query1('2016-01-23');

关于postgresql - 日期动态表名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37752296/

10-16 21:50