Postgresql 常用整理

文章目录

  • 1. 查询
    • 1.1数据库表
      • 1.1.1 获取指定数据库表
      • 1.1.2 获取指定数据库表所有列名
    • 1.2 别名
      • 1.2.1 子表指定别名
      • 1.2.2 查询结果指定别名
    • 1.3 临时表
      • 1.3.1 定义临时表
      • 1.3.2 使用临时表
    • 1.4 子表
    • 1.5 分组
      • 1.5.1 group by
      • 1.5.2 partition by
    • 1.6 分组后合并指定列字段:
    • 1.7 查询条件判断:case when
    • 1.8 大小判断
      • 1.8.1 日期
      • 1.8.2 其他
    • 1.9 空值判断
      • 1.9.1 判断null
      • 1.9.2 判断空串 ‘’
      • 1.9.3 判断null和空串
    • 1.10 时间函数
      • 1.10.1 获取当前日期
      • 1.10.2 获取昨天、上周、上年日期
      • 1.10.3 获取今天、今月、今年的开始日期
      • 1.10.4 从时间戳提取年、月、日、时分秒,周
      • 1.10.5 取年、月、日、时分秒、星期数
      • 1.10.6 获取时间差(获取年、月、日差)
      • 1.10.7 获取日期差
    • 1.11 判断字符串是否包含
    • 1.12 取json字符串指定字段
      • 1.12.1 json和jsonb操作符
      • 1.12.2 操作实例
      • 1.12.3 处理json数组
    • 1.14 拼接字符串
  • 2. 创建函数(以获取日期间隔为例)
    • 2.1 创建方式
    • 2.2 函数使用

1. 查询

1.1数据库表

1.1.1 获取指定数据库表

SELECT table_name FROM
information_schema.TABLES
WHERETABLE_SCHEMA = 'act' -- 数据库名称
AND table_name LIKE '%act_re%';

1.1.2 获取指定数据库表所有列名

select column_name from information_schema.columns where table_name='ppom_object' ORDER BY ORDINAL_POSITION

1.2 别名

1.2.1 子表指定别名

  • 父表根据子表别名获取列,使用as直接加英文方式
select  display_name as alias_display_name

1.2.2 查询结果指定别名

  • 使用as 加英文双引号括住名称
select  display_name as "显示名称"

1.3 临时表

1.3.1 定义临时表

  • 多个临时表,使用一个with,其他逗号分隔,最后一个不需要逗号
with  临时表名1  as (sql查询), 临时表名2 as(sql查询)

1.3.2 使用临时表

select * from 临时表名1 t1, 临时表名2 t2

1.4 子表

  • 外部条件需要取子表列情况下,子表需要有别名(例如temp),通过别名获取
select * from (sql查询) temp where 条件

1.5 分组

1.5.1 group by

  • 只可获取到分组的列(可以有多个)和按分组汇总数量或求和结果
select uid,name, count(*) from table group by uid,name

1.5.2 partition by

  • 支持获取除分组的列以外其他的列,一般可以跟row_number()组合获取分组序号,按序号获取指定排序后的序号列
select * from (select row_number() over(partition by object_uid ORDER BY created_time ASC) AS new_index
)temp 
where temp.new_index = 1

1.6 分组后合并指定列字段:

  • 使用array_to_string和array_agg组合
    • array_to_string(数组列,分隔符)
    • array_agg( expression),加distinct去重,把表达式变成一个数组
SELECT uid, array_to_string(array_agg(distinct display_name),';') AS name FROM tmp GROUP BY uid

1.7 查询条件判断:case when

case when 条件1 then 结果1when 条件2 then 结果2else 结果3end  可对结果添加别名

1.8 大小判断

1.8.1 日期

select date_trunc('day',now()) = date_trunc('day',date('20230908'))
- 日期为datetimestamp,和字符串比较,字符串需要先转datetimestamp
select time1::timestamp > time2::timestamp
select time1::timestmap > to_timestamp('2023-11-15 18:33:41','yyyy-MM-dd hh24:mi:ss');
select to_date('2023-11-15 18:33:41','yyyy-MM-dd hh24:mi:ss');

1.8.2 其他

select a > b
# 大于:> ,小于:< ,等于:= ,不等于  !=  或 <> 

1.9 空值判断

1.9.1 判断null

select * from table where uid is null
select * from table where uid is not null

1.9.2 判断空串 ‘’

select * from table where uid = ''
select * from table where uid != ''select * from table where uid <> ''

1.9.3 判断null和空串

select * from table where length(uid) > 0
select * from table where length(uid)  <= 0

1.10 时间函数

  • (整合资料:https://blog.csdn.net/qq_40323256/article/details/123185022)

1.10.1 获取当前日期

select now();
select current_timestamp;
select to_char( now(),'yyyy-mm-dd hh:mi:ss');
select to_char(时间戳字段,'yyyy-mm-dd hh24:mi:ss');
#hh默认是12,可指定:hh12,hh24
select current_date;

1.10.2 获取昨天、上周、上年日期

select to_char( now() - interval '1 day','yyyy-mm-dd');
select to_char( now() - interval '1 week','yyyy-mm-dd hh:mi:ss');
select to_char( now() - interval '1 month','yyyy-mm-dd');
select to_char( now() - interval '1 year','yyyy-mm-dd');

1.10.3 获取今天、今月、今年的开始日期

select date_trunc('year', now())
select date_trunc('month', now())
select date_trunc('day', now())
select date_trunc('hour', now())
select date_trunc('minute', now())
select date_trunc('second', now())

1.10.4 从时间戳提取年、月、日、时分秒,周

select date_part('year', timestamp '2001-02-16 20:38:40')
#或者
select date_part('year', '2001-02-16 20:38:40'::timestamp)
select date_part('month', timestamp '2001-02-16 20:38:40')
select date_part('day', timestamp '2001-02-16 20:38:40')
select date_part('hour', timestamp '2001-02-16 20:38:40')
select date_part('minute', timestamp '2001-02-16 20:38:40')
select date_part('second', timestamp '2001-02-16 20:38:40')
select date_part('week', timestamp '2001-02-16 20:38:40')

1.10.5 取年、月、日、时分秒、星期数

// 从当前时间中提取年份
SELECT EXTRACT(YEAR FROM TIMESTAMP '2023-05-20 16:54:53.644833');    // 从当前时间中提取月份   
SELECT EXTRACT(MONTH FROM TIMESTAMP '2023-05-20 16:54:53.644833'); // 从当前时间中提取天     
SELECT EXTRACT(DAY FROM TIMESTAMP '2023-05-20 16:54:53.644833');    // 从当前时间中提取小时    
SELECT EXTRACT(HOUR FROM TIMESTAMP '2023-05-20 16:54:53.644833');     // 从当前时间中提取分钟  
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2023-05-20 16:54:53.644833');     // 从当前时间中提取秒
SELECT EXTRACT(SECOND FROM TIMESTAMP '2023-05-20 16:54:53.644833');     // 从当前时间中提取世纪
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2023-05-20 16:54:53.644833');    // 从当前时间中提取时间戳,单位:秒
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2023-05-20 16:54:53.644833');      
//取星期数
SELECT EXTRACT(DOW FROM TIMESTAMP '2023-05-20 16:54:53.644833');  

1.10.6 获取时间差(获取年、月、日差)

#只获取年、月、日数据,其他忽略
select date_part('year', endtime::TIMESTAMP-starttime::TIMESTAMP)
select date_part('month', endtime::TIMESTAMP-starttime::TIMESTAMP)
select date_part('day', endtime::TIMESTAMP-starttime::TIMESTAMP)
#获取整体时间差,默认秒
#时间差换算成日
select date_part('epoch', endtime::timestamp - starttime::TIMESTAMP)/60/60/24
#可以外部套一层向下取整floor()、向上取整ceil()、四舍五入round()取整
select floor(date_part('epoch', endtime::timestamp - starttime::TIMESTAMP)/60/60/24)
#时间差换算成小时
select date_part('epoch', endtime::timestamp - starttime::TIMESTAMP)/60/60
#时间差换算成分钟
select date_part('epoch', endtime::timestamp - starttime::TIMESTAMP)/60

1.10.7 获取日期差

#只取日期部分计算
select Date(endtime) - DATE(starttime)

1.11 判断字符串是否包含

  • position(substring in string),第一个时目标字符串,第二个是原字符串,如果包含,返回第一次出现位置,根据是否大于0判断
select postion('aa' in 'abcd')
  • strpos(string, substring),作用与position一致

1.12 取json字符串指定字段

  • (参考资料:https://blog.csdn.net/c_zyer/article/details/130968257)

1.12.1 json和jsonb操作符

在这里插入图片描述

1.12.2 操作实例

select order_json::json->'orderBody' from order -- 对象域
select order_json::json->>'orderBody' from order -- 文本
select order_json::json#>'{orderBody}' from order -- 对象域
select order_json::json#>>'{orderBody}' from order -- 文本# 列名:column,列值: {"key":"","name":"发起人修改","id":""}
select column::json ->> 'name'

1.12.3 处理json数组

#取数组长度
select json_array_length(name::json)#取出json数组中的某个字段返回json数组
#列名:column,列值:[{"key":"","name":"xxx","id":""}]
select json_array_elements(column::json) -> 'name'

1.14 拼接字符串

// a11b
select concat('a', 11, NULL, 'b');
// aabb
select  'aa' || 'bb'

2. 创建函数(以获取日期间隔为例)

2.1 创建方式

  • 可以通过sql文件执行函数定义,或者通过sql工具界面操作创建函数的方式,部分工具(以HeidiSQL为例)执行sql在包含主题的 B O D Y BODY BODY处会提示,以及不能使用 符号,可以在其他工具执行( N a v i c a t e 、 p g A d m i n ): u n t e r m i n a t e d d o l l a r − q u o t e d s t r i n g a t o r n e a r " 符号,可以在其他工具执行(Navicate、pgAdmin): unterminated dollar-quoted string at or near " 符号,可以在其他工具执行(NavicatepgAdmin):unterminateddollarquotedstringatornear"BODY$
  • 函数内容
-- 定义函数所处表,名称,public.f_daydelay,
-- 输入参数名称 类型 
-- 返回类型 RETURNS type
-- 创建函数语言选择 LANGUAGE,可以选择(plpgsql,sql,plpython,plperl,...)
-- 启动成本 COST 100(默认值)
-- 波动率 VOLATILE (波动率默认分类),可以执行任何操作CREATE OR REPLACE FUNCTION public.f_daydelay(starttime timestamp with time zone,endtime timestamp with time zone)RETURNS numericLANGUAGE 'plpgsql'COST 100VOLATILE PARALLEL UNSAFE
AS $BODY$--声明函数使用变量名称 类型,函数都需要使用分号结尾
DECLAREv_return  varchar;--返回间隔时间 xx日xx时xx分
--函数主体    
BEGIN--省略方法--返回值     RETURN v_return;--异常处理EXCEPTION WHEN OTHERS THENRETURN SQLERRM;
--主体结束    
END;
$BODY$;--定义函数授权用户
ALTER FUNCTION public.f_daydelay(timestamp with time zone, timestamp with time zone)OWNER TO postgres;

2.2 函数使用

select f_daydelay('2023-05-24 11:38:14.38'::timestmap,'2023-06-20 11:38:14.38'::timestamp);

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenVINO】基于 OpenVINO C# API 部署 RT-DETR 模型

基于 OpenVINO C# API 部署 RT-DETR 模型 1. RT-DETR2. OpenVINO3. 环境配置4. 模型下载与转换5. C#代码实现5.1 模型推理类实现1. 模型推理类初始化2. 图片预测API 5.2 模型数据处理类RTDETRProcess1. 定义RTDETRProcess2. 输入数据处理方法3. 预测结果数据处理方法 6. 预测结…

Opencv!!在树莓派上安装Opencv!

一、更新树莓派系统 sudo apt-get update sudo apt-get upgrade二、安装python-opencv sudo apt-get install libopencv-dev sudo apt-get install python3-opencv三、查看是否安装成功 按以下命令顺序执行&#xff1a; python import cv2 cv2.__version__如果出现版本号&a…

Netty入门指南之NIO 粘包与半包

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题产…

酷柚易汛ERP - 其他入库单操作指南

1、应用场景 处理其他非采购类型的入库单据&#xff0c;比如赠品、获赔商品、以货抵债、借入、接受捐赠等不参与采购管理的入库类业务。 2、主要操作 2.1 新增其他入库单 打开【仓库】-【其他入库单】&#xff0c;选择商品后&#xff0c;根据存货核算方法自动计算出单位成本…

Java jdbc连接Oracle时出现ORA-28040: No matching authentication protocol报错

一、问题描述 升级了oracle数据库版本后&#xff0c;同时也更新了oracle的驱动为ojdbc8.jar&#xff0c;Java重新通过jdbc连接Oracle时出现ORA-28040: No matching authentication protocol报错。 完整报错信息 java.sql.SQLException: ORA-28040: No matching authenticati…

ARM Linux 基础学习 / 系统相关,文件系统,文件属性

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…

我的前端笔记JS

软件 js介绍 js是编程语音&#xff0c;之前学的html和css是标记语言 百度搜索mdn官网就可以 语法 输出、对话框、控制台日志、输入对话框 字面量 简单理解就是看到的内容是属于什么类型&#xff0c;例如1232&#xff0c;这个是属于数字字面量 变量 输入并保存数据 交互两个变…

2023nacos源码解读第3集——nacos-client核心功能之微服务调用和配置管理测试

文章目录 1、测试项目2、项目注意事项3、 测试核心功能3.1 测试服务调用与负载均衡3.2 测试配置监听 4、参考文档 1、测试项目 项目地址 nacos-service-a nacos-service-b 2、项目注意事项 项目初始化可以使用aliyun spring initializer ,以更方便的使用springcloud alibaba…

iceoryx(冰羚)-Service Discovery

Service Discovery Summary and problem description IPC通道&#xff08;例如消息队列或UNIX域套接字&#xff09;上的服务发现是不可执行的&#xff0c;因为传输的数据较大&#xff0c;这可能会导致多个帧的传输。如果发现大量高频服务&#xff0c;例如在启动时&#xff0c…

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)

版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…

光刻机ASML CYMER光电模块组件维修114122,S111310

1&#xff1a;436nm g-line 可以满足0.8-0.35 微米制程芯片的生产&#xff0c;对应设备有接触式和接近式光刻机。 2&#xff1a;365nm i-line 同样可以满足0.8~0.35微米制程芯片的生产。设备于上相同。 早期的光刻机采用接触式光刻&#xff0c;即掩模贴在硅片上进行光刻&…

【MongoDB】索引 – 通配符索引

一、准备工作 这里准备一些数据 db.books.drop();db.books.insert({_id: 1, name: "Java", alias: "java 入门", description: "入门图书" }); db.books.insert({_id: 2, name: "C", alias: "c", description: "C 入…