pg自定义函数动态生成表名

目录

一、需求

二、踩坑记录

三、解决方案


一、需求

想在postgres数据库中动态查询【'table_2023'、'table_2024'...】这种格式表的数据。

例如:

      今天是'2023-12-22'号,查询语句为'select * from table_2023';

      今天是'2024-12-22'号,查询语句为'select * from table_2024';

      以此类推。。。

二、踩坑记录

一开始打算sql拼接出表名,但是很快发现问题

select * 
from (
select concat('table_',extract(year from now())) as this_year
) a
;

执行后并不是我想要的结果,查询出来的只是我拼接出来的内容 😭

三、解决方案

最后放弃了sql拼接,决定直接自定义函数解决。

第一种方法,创建自定义函数查询当年表的数据。

--生成查询'table_'当年格式数据表数据
CREATE OR REPLACE FUNCTION "get_thisyear_table"()
  RETURNS TABLE("col1" int8,"col2" varchar(255),"col3" int8) AS $BODY$
    DECLARE
    subquery  varchar;
    pre_sql   varchar;
    this_year int;
    begin
    pre_sql:='select extract(year from now())';
    EXECUTE pre_sql into this_year;
    subquery := 'select col1,col2,col3 from "table_'||this_year||'"';
    RETURN QUERY execute subquery;
    END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000
  ;
  
--调用函数查看数据  
select * from get_thisyear_table();

 

第二种方法,创建新表存储符合格式的所有表union all数据。

--创建新表union_tables存储多个动态表union all之后的数据
--(ps:只有2个及以上要union all的表时才可以)
CREATE OR REPLACE FUNCTION get_unionall_table()
  RETURNS void AS $BODY$
DECLARE
    sqlSearch TEXT DEFAULT '';
    drop_sql  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 'table_%' 
  AND LENGTH ( tablename ) = LENGTH ( '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 col1,col2, col3 from ' || cur_tablename || ' union all ';

END LOOP;
-- Close the cursor
CLOSE cur_data;
drop_sql :='drop table if exists union_tables';
EXECUTE drop_sql;
sqlSearch := substr( sqlSearch, 1, "length" ( sqlSearch ) - LENGTH ( 'union all ' ) );
sqlSearch := 'create table IF NOT EXISTS  union_tables as (' || sqlSearch|| ')';
EXECUTE sqlSearch;
END; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000
;

--调用函数
select get_unionall_table();
--验证数据
select * from union_tables;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat里MySQL表的创建(详细)

我以Navicat连接MySQL为例,演示表的创建方法。 前提 创建表的语法: create table 表名 ( 字段名1,字段类型, 字段名2,字段类型, ...... 字段名n,字段类型 ); 我计划在test库存放一…

【c】无限制输入字符

我们做题有时候会碰上这种的输入,一直输入字符, 下面附上两种解决办法 方法1: char s[10000]; int i0; int arr[1000]{0}; while(scanf("%c",&s[i])!EOF) { i; } 这样你就可以一直输入&#xff0…

深信服AF防火墙升级步骤(简单粗暴)

设备当前版本:AF8.0.75 升级升级后版本:AF8.0.85 官方发行:内容比较多,找设备当前版本在不在支持升级的列表即可 8.0.75是可以直接升到8.0.85的 升级前注意事项: 升级是需要重启设备的,会断网&#xff…

FreeRTOS之队列集操作(实践)

多个任务在在同一队列中传递的同一种数据类型,而队列集能够在任务之间传递不同的数据类型。 配置流程:(更详细流程参考正点原子的教程) 1、启用队列集将configUSE_QUEUE_SETA置1) 2、创建队列集 3、创建队列或信号…

Java中的Stream流收集器

目录 1、归约和汇总 2、分组 3、分区 4、理解收集器接口 Java 中 Stream 流用来帮助处理集合,类似于数据库中的操作。 在 Stream 接口中,有一个抽象方法 collect,你会发现 collect 是一个归约操作(高级规约)&#…

[NISACTF 2022]easyssrf

[NISACTF 2022]easyssrf wp ssrf 的题目,提示了会使用 curl 连接输入的网站并返回响应包。 测试连接百度 直接在输入框中写 www.baidu.com 是无法连接的,需要在前面加入 http 或者 https ,因为 curl 的使用方式就是: curl htt…

linux系统和网络(二):进程和系统时间

本文主要探讨linux系统进程和系统相关知识,本博客其他博文对该文章的部分内容有详细介绍 main函数 int main(int argc,char *argv[],char *envp[]); 操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中…

MyBatis关联查询(三、多对多查询)

MyBatis关联查询(三、多对多查询) 需求:查询角色及角色赋予的用户信息。 分析:一个用户可以拥有多个角色,一个角色也可以赋予多个用户,用户和角色为双向的一对多关系,多对多关系其实我们看成是…

代码随想录第三十八天(一刷C语言)|零钱兑换II组合总数和 IV

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换II 思路:参考carl文档 1、确定dp数组以及下标的含义:凑成总金额j的货币组合数为dp[j]。 2、确定递推公式:dp[j] 就是所有的dp[j - coins[i…

lpg期货指数(LPG期货指数盘整整理)

什么是LPG期货指数? LPG期货指数是以液化石油气(Liquefied Petroleum Gas)作为标的物的期货指数,涵盖了LPG国内期货市场的价格变化。LPG是一种广泛用于家庭、工业和交通等领域的燃料。在中国,LPG期货主要交易于上海国…

面试遇到了接口分析和测试用例分析题,该如何下手?

只要有软件产品的公司百分之九十以上都会做接口测试,要做接口测试的公司那是少不了接口测试工程师的,接口测试工程师相对于其他的职位又比较轻松并且容易胜任。如果你想从事接口测试的工作那就少不了对接口进行分析,同时也会对测试用例进行研…

使用Docker-镜像命令

镜像名称一般分两部分组成:[repository]:[tag] 在没有指定tag时,默认是latest,代表最新版本的镜像 目录 案例一:从DockerHub中拉取一个nginx镜像并查看 1.1. 首先去镜像仓库搜索nginx镜像,比如DockerHub ​编辑 1.2.操作拉取n…

【算法刷题】Day23

文章目录 1. 打家劫舍 II题干:算法原理:(dp)1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码: 2. 和为 K 的子数组题干:算法原理:1. 暴力枚举2. 前缀和 哈希表 代码…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…

macOS 开发 - MASShortcut

文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群:644096295,V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具,替代和兼容 ShortcutRecorder github : https://git…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近,我在使用电脑时遇到了一个问题,即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件,它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…

java-sec-code中rmi

java-sec-code中rmi 暂时没有搞懂原理,这里只说明利用方法 java-sec-code 作者给出的是使用ysoserial进行利用 测试环境搭建 docker环境下,1099端口默认不开启,这里使用idea运行org.joychou.RMI.Server即可 个人电脑java环境分为1.8.381 1.8.…

生成式AI大爆发,2024年人工智能3大发展趋势预测

人工智能(AI)多年来一直是技术界讨论的热门话题,但在2023年,它完全抓住了大众的注意力和想象力。ChatGPT和类似的技术让外行人也能接触到人工智能,生成式AI以前所未有的速度从小众走向主流。在大家都普遍认为AI存在着能力局限性的情况下&…

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测(Blob) 斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点)&#…

CSS3多列分页属性

CSS3多列 Firefox浏览器支持该属性的形式是-moz-column-count,而基于Webkit的浏览器,例如Safari和Chrome,支持该属性的形式是-webkit-column-count column-count:该属性定义多列文本流中的栏数 语法:column-count:int…