当前位置:网站首页>postgresql 使用存储过程,拼接多张表,查询数据

postgresql 使用存储过程,拼接多张表,查询数据

2022-06-12 09:56:00 自己的九又四分之三站台

在使用过程中,由于数据随年份的变化数据会发生变化 ,现在需要每次统计时将数据汇总统计。

表名结构如下:

  • unionall_table_2021
  • unionall_table_2022
  • unionall_table_2020

1. 将每年的数据显示union all拼接

create view vw_unionall_table
as
select * from unionall_table_2020
union all 
select * from unionall_table_2021
union all 
select * from unionall_table_2022

2. 使用存储过程,动态构建查询

CREATE OR REPLACE FUNCTION get_unionall_table()
  RETURNS TABLE("objectid" int4, "f_tbbh" varchar, "f_dlbm" varchar, "f_area" numeric, "f_xzqdm" varchar, "f_year" int4) AS $BODY$
DECLARE
	sqlSearch TEXT DEFAULT '';
rec_data RECORD;
cur_data REFCURSOR;
cur_tablename TEXT;
BEGIN-- Open the cursor
	OPEN cur_data FOR SELECT
	tablename 
	FROM
		pg_tables 
	WHERE
		tablename LIKE'unionall_table_%' 
		AND LENGTH ( tablename ) = LENGTH ( 'unionall_table_xxxx' );
	FETCH cur_data INTO rec_data;
	while
	FOUND
		LOOP-- fetch row into the film
		cur_tablename := rec_data.tablename;
	FETCH NEXT 
	FROM
		cur_data INTO rec_data;
	sqlSearch := sqlSearch || ' select objectid, f_tbbh,f_dlbm,f_area,f_xzqdm,f_year from ' || cur_tablename || ' union all ';
	
END LOOP;
-- Close the cursor
CLOSE cur_data;
sqlSearch := substr( sqlSearch, 1, "length" ( sqlSearch ) - LENGTH ( 'union all ' ) );
RETURN query EXECUTE sqlSearch;
END; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000
create view vw_unionall_table
as
select get_unionall_table();
原网站

版权声明
本文为[自己的九又四分之三站台]所创,转载请带上原文链接,感谢
https://qlygmwcx.blog.csdn.net/article/details/125232090