PostgreSql查询动态表名数据

本文记录了在PostgreSQL数据库中如何处理动态表名查询的问题。作者最初尝试使用SQL Server类似的变量声明方式,但在PostgreSQL中未成功。接着尝试创建函数返回结果集,但仍然无法获取数据。最终通过在函数中使用`RETURN QUERY EXECUTE`成功实现了动态查询,从而解决了问题。
摘要由CSDN通过智能技术生成

碰到这样一个需求, postgresql数据库里每天会生成一张新表,表名的规律是 “前缀_YYYY-MM-DD”,前缀加日期的形式,这样sql查询时,查询一个表里的数据,但是表名是动态变化的。
记录下本次解决过程,着急的可以直接点击看结果

  1. 最开始的想法是像SQLserver一样 查询前定义变量,在查,参考1 类似:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
	FROM somewhere
	WHERE something = @myvar

但是pgsql没有这样的功能,有个with()查询,它可以作为变量,例如:

WITH tableName AS ( VALUES ( concat ( 'table_', CURRENT_DATE ) ) ) 
SELECT * FROM tableName

但事实上,这样只是把表名存在了这个变量中,查询只是把这个变量从临时表中读取出来,没有实现效果。

  1. 之后,在网络上搜索,得到下面的思路。
    创建一个函数,函数的结果集是查询该动态表名的结果集,查询该结果集获得结果,参考2
CREATE OR REPLACE FUNCTION "get_table"("tname" varchar)
	  RETURNS SETOF "pg_catalog"."record" AS $BODY$
	    DECLARE
	    subquery varchar;
	    begin
	    subquery := 'select * from "'||tname||'"';
	    execute subquery;
	    END$BODY$
	  LANGUAGE plpgsql VOLATILE
	  COST 100
	  ROWS 1000
SELECT    *  FROM    get_table ( concat ( 'Monitor_', CURRENT_DATE ) ) AS monitor ( ID int4, TIME TIMESTAMP, Program TEXT )

但是查询结果为空
在这里插入图片描述
继续搜索,参考3,直接返回table,

CREATE OR REPLACE FUNCTION "get_table"("tname" varchar)
  RETURNS TABLE("ID" int4, "TIME" timestamp, "Program" text) AS $BODY$
    DECLARE
    subquery varchar;
    begin
    subquery := 'select * from "'||tname||'"';
    execute subquery;
    END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000

但是查询结果依旧是空。
在这里插入图片描述

注意到,在函数中使用了'EXECUTE'

在这里插入图片描述

参考4,在函数中,使用EXECUTE返回表
修改函数,添加RETURN QUERY

CREATE OR REPLACE FUNCTION "get_table"("tname" varchar)
  RETURNS TABLE("ID" int4, "TIME" timestamp, "Program" text) AS $BODY$
    DECLARE
    subquery varchar;
    begin
    subquery := 'select * from "'||tname||'"';
    RETURN QUERY execute subquery;
    END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000
SELECT    *  FROM    get_table ( concat ( 'Monitor_', CURRENT_DATE ) )

成功获取数据,顺利解决😊

参考:
1. 参考1
2. 参考2
3. 参考3
4. 参考4

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值