postgreSQL 9.3中的动态表名

时间:2013-12-09 11:38:30

标签: postgresql

我正在使用postgreSQL。我想从表中选择数据。此表名包含当前年份。比如abc2013。我试过了

select * from concat('abc',date_part('year',current_date)) 

select  *from from  concat('abc', extract (year from current_date))

那么如何动态地从这样的表中获取数据呢?

1 个答案:

答案 0 :(得分:2)

请不要这样做 - 首先要仔细查看备选方案,从partitioning and constraint exclusion开始。

如果必须使用动态表名,请在查询生成期间在应用程序级别执行此操作。

如果所有其他方法都失败了,您可以使用PL / PgSQL程序,如:

CREATE OR REPLACE pleasedont(int year) RETURNS TABLE basetable AS $$
BEGIN
    RETURN QUERY EXECUTE format('SELECT col1, col2, col3 FROM %I', 'basetable_'||year);
END;
$$ LANGUAGE plpgsql;

仅当您具有与子表具有相同结构的基表时,此方法才有效。当你开始添加限定符(where子句约束等)时,使用它也会非常痛苦,并且它会阻止任何类型的计划缓存或有效的预处理语句使用。