如何将information_schema.tables的字符串结果作为PostgreSQL查询的表名
PostgreSQL 动态查询最新日期表并创建视图
由于PostgreSQL的普通视图定义是静态的,无法直接动态切换查询的表名,你可以通过PL/pgSQL函数封装动态逻辑,再基于函数创建视图来实现需求。
步骤1:编写动态获取最新表数据的函数
假设你获取最新表名的逻辑是筛选cm_nokia schema下名称以umts_cells_开头的表,按表名降序取第一个(日期后缀为数字,降序即对应最新日期),可以用以下函数:
CREATE OR REPLACE FUNCTION cm_nokia.get_latest_umts_cells() RETURNS SETOF record AS $$ DECLARE latest_table text; BEGIN -- 获取最新表名 SELECT tablename INTO latest_table FROM pg_tables WHERE schemaname = 'cm_nokia' AND tablename LIKE 'umts_cells_%' ORDER BY tablename DESC LIMIT 1; -- 动态执行查询,%I用于安全转义标识符,避免SQL注入 RETURN QUERY EXECUTE format('SELECT * FROM cm_nokia.%I', latest_table); END; $$ LANGUAGE plpgsql;
如果明确知道目标表的结构,建议将RETURNS SETOF record替换为具体的表结构定义,这样调用时无需额外指定列信息,示例:
CREATE OR REPLACE FUNCTION cm_nokia.get_latest_umts_cells() RETURNS TABLE ( cell_id integer, cell_name varchar(50), location point, created_date date ) AS $$ DECLARE latest_table text; BEGIN SELECT tablename INTO latest_table FROM pg_tables WHERE schemaname = 'cm_nokia' AND tablename LIKE 'umts_cells_%' ORDER BY tablename DESC LIMIT 1; RETURN QUERY EXECUTE format('SELECT cell_id, cell_name, location, created_date FROM cm_nokia.%I', latest_table); END; $$ LANGUAGE plpgsql;
步骤2:基于函数创建视图
如果函数用了具体的RETURNS TABLE定义,直接创建视图即可:
CREATE VIEW cm_nokia.latest_umts_cells AS SELECT * FROM cm_nokia.get_latest_umts_cells();
如果用的是RETURNS SETOF record,创建视图时需要指定列名和类型(与目标表结构一致):
CREATE VIEW cm_nokia.latest_umts_cells AS SELECT * FROM cm_nokia.get_latest_umts_cells() AS t( cell_id integer, cell_name varchar(50), location point, created_date date );
之后直接查询cm_nokia.latest_umts_cells就能获取最新表的内容,每次查询时函数会自动获取最新表名并返回对应数据。
内容的提问来源于stack exchange,提问作者Voicu Mirel
相关产品推荐
相关产品推荐

