Postgresql使用技巧
- 1.递归层次查询
- 2.重复数据过滤
- 3.COALESCE滤空处理
- 4.日期、字符转换函数
- 5.case when条件判断
- 6.like模糊查询
- 7.json中作为查询条件及只显示json中相应的key
- 8.mybatis调用存储过程
- 9.插入数组字段
- 10.插入jsonb字段
- 11.创建表序列技巧
- 12.聚合函数string_agg与array_agg
- 13.查询序列值
- 14.增加修改列
- 15.数据列联表更新
1.递归层次查询
- 例:查询代理商及下属代理商
WITH RECURSIVE res AS (SELECTA .agent_idFROMAGENT.AGENT AWHEREA .agent_id = 620UNION ALLSELECTb.agent_idFROMAGENT.AGENT b,resWHEREb.parent_agent_id = res.agent_id
) SELECTagent_id
FROMres
- 指定查询字段
WITH RECURSIVE res (agent_id,parent_agent_id,agent_name,remark,email,warn
) AS (SELECTA .agent_id,A .parent_agent_id,A .agent_name,A .remark,A .email,A .warnFROMAGENT.AGENT AWHEREA .agent_id = 620UNION ALLSELECTb.agent_id,b.parent_agent_id,b.agent_name,b.remark,b.email,b.warnFROMAGENT.AGENT b,resWHEREb.parent_agent_id = res.agent_id
) SELECTagent_id,parent_agent_id,agent_name,remark,email,warn
FROMres
ORDER BYagent_id ASC
2.重复数据过滤
SELECT*
FROMestate.room A
WHEREctid != (SELECTMAX (ctid)FROMestate.room bWHEREA .unit_id = b.unit_IdAND A .room_number = b.room_number);
3.COALESCE滤空处理
SELECTCOALESCE (MAX(sort_num), 0) + 1 AS maxnum
FROMestate.unit
WHEREbuilding_id = 11
4.日期、字符转换函数
- to_date,to_char类似oracle
5.case when条件判断
case dep."type" when 7 then true else false end as isSign
6.like模糊查询
and dept_name like CONCAT('%',#{depName},'%')
7.json中作为查询条件及只显示json中相应的key
SELECTA .subsql -> 'ver' AS ver,A .subsql
FROM(SELECTguid,jsonb_pretty (config :: jsonb),jsonb_array_elements (config :: jsonb -> 'expands') AS subsqlFROMlog."ConfigLog") A
--WHERE
-- A .subsql @> '{"type":2,"name":"刷卡器"}' :: jsonb
LIMIT 10;
SELECTA .subsql -> 'ver' AS ver,A .subsql
FROM(SELECTguid,jsonb_pretty (config :: jsonb),jsonb_array_elements (config :: jsonb -> 'expands') AS subsqlFROMlog."ConfigLog") A
WHERE--条件 json字段包含"type":2,"name":"刷卡器"的数据A .subsql @> '{"type":2,"name":"刷卡器"}' :: jsonb
LIMIT 10;
8.mybatis调用存储过程
int bindRoomWithManagementAndDoor(@Param("map") Map<String, Object> map, @Param("deviceIds") List<Integer> deviceIds);
<!--房间绑定管理机、门禁机--><select id="bindRoomWithManagementAndDoor" resultType="java.lang.Integer">SELECT * FROM device.new_wy_manage_device_bind(#{map.depId,jdbcType=INTEGER},#{map.managementGuid,jdbcType=VARCHAR}, #{map.managementName,jdbcType=VARCHAR},#{map.roomId,jdbcType=INTEGER}, #{map.unitId,jdbcType=INTEGER}, #{map.buildingId,jdbcType=INTEGER},<foreach collection="deviceIds" item="deviceId" index="index" open="ARRAY[" close="]" separator=",">#{deviceId}</foreach>)</select>
<![CDATA[and bw.worker_date <=#{beginTime}]]>
9.插入数组字段
<result column="devices" property="devices" javaType="java.lang.Integer" typeHandler="com.doordu.soa.service.comm.hadler.ArrayTypeHandler"/>
"devices" int4[],
#{devices,typeHandler=com.doordu.soa.service.comm.hadler.ArrayTypeHandler}::int4[],
10.插入jsonb字段
<result column="id_pay_rule" property="idPayRule" jdbcType="OTHER" />#{idPayRule,jdbcType=OTHER}::jsonb,
Json格式
11.创建表序列技巧
serial PRIMARY KEY
DROP TABLE "device"."camera";
CREATE TABLE "device"."camera" ("camera_id" serial PRIMARY KEY,"camera_name" VARCHAR (200) COLLATE "default" NOT NULL,"serial_number" VARCHAR (200) COLLATE "default" NOT NULL,"brand_id" int2 DEFAULT 0 NOT NULL,"create_user" int4 DEFAULT 0 NOT NULL,"create_time" TIMESTAMP (0) DEFAULT (now()) :: TIMESTAMP (0) WITHOUT TIME ZONE
);ALTER TABLE "device"."camera" OWNER TO "ddpguser";COMMENT ON COLUMN "device"."camera"."camera_id" IS '主键';COMMENT ON COLUMN "device"."camera"."camera_name" IS '相机名';COMMENT ON COLUMN "device"."camera"."serial_number" IS '序列号';COMMENT ON COLUMN "device"."camera"."brand_id" IS '品牌';COMMENT ON COLUMN "device"."camera"."create_user" IS '创建人';COMMENT ON COLUMN "device"."camera"."create_time" IS '创建时间';
12.聚合函数string_agg与array_agg
https://blog.csdn.net/u011944141/article/details/78902678
array_agg(expression)
把表达式变成一个数组 一般配合 array_to_string() 函数使用
string_agg(expression, delimiter)
直接把一个表达式变成字符串
CREATE SCHEMA jinbo;
CREATE TABLE jinbo.employee (empno SMALLINT,ename VARCHAR (20),job VARCHAR (20),mgr SMALLINT,hiredate DATE,sal BIGINT,comm BIGINT,deptno SMALLINT
);
INSERT INTO jinbo.employee (empno,ename,job,mgr,hiredate,sal,comm,deptno
)
VALUES(7499,'ALLEN','SALEMAN',7698,'2014-11-12',16000,300,30);INSERT INTO jinbo.employee (empno,ename,job,mgr,hiredate,sal,comm,deptno
)
VALUES(7499,'ALLEN','SALEMAN',7698,'2014-11-12',16000,300,30);INSERT INTO jinbo.employee (empno,ename,job,mgr,hiredate,sal,comm,deptno
)
VALUES(7654,'MARTIN','SALEMAN',7698,'2016-09-12',12000,1400,30);
- 1.查询同一个部门下的员工且合并起来
方法1:
select deptno, string_agg(ename, ',') from jinbo.employee group by deptno; deptno | string_agg
--------+--------------
20 | JONES
30 | ALLEN,MARTIN
方法2:
select deptno, array_to_string(array_agg(ename),',') from jinbo.employee group by deptno;deptno | array_to_string
--------+-----------------20 | JONES30 | ALLEN,MARTIN
- 2、在1条件的基础上,按ename 倒叙合并
select deptno, string_agg(ename, ',' order by ename desc) from jinbo.employee group by deptno;
3、 deptno | string_agg
4、--------+--------------
5、 20 | JONES
6、 30 | MARTIN,ALLEN
- 3、按数组格式输出使用 array_agg
select deptno, array_agg(ename) from jinbo.employee group by deptno;deptno | array_agg
--------+----------------20 | {JONES}30 | {ALLEN,MARTIN}
- 4、array_agg 去重元素,例如查询所有的部门
select array_agg(distinct deptno) from jinbo.employee;
array_agg
-----------{20,30}
(1 row)
不仅可以去重,还可以排序
select array_agg(distinct deptno order by deptno desc) from jinbo.employee;array_agg
-----------{30,20}
(1 row)
13.查询序列值
select nextval('log.admin_operation_log_id_seq')
14.增加修改列
ALTER TABLE "report"."tunan_fwxxz"
ADD COLUMN "update_time" timestamp DEFAULT now()::timestamp(0) without time zone;alter table report.ut_estate alter COLUMN mpmc type varchar(100) ;
15.数据列联表更新
update report.ut_estate a set jwh=b.jwhmc from estate.panyu_jwh b where a.jwhdm=jwhbm;
Postgresql使用技巧相关推荐
- PostgreSQL实用技巧
日志功能 记录慢查询语句 开启慢查询记录功能,执行时间等于或者大于 log_min_duration_statement 设置值的语句会被记录: ALTER database postgres SET ...
- postgresql学习_在PostgreSQL中学习这些快速技巧
postgresql学习 PostgreSQL is one of the most popular open source SQL dialects. One of its main advanta ...
- PostgreSQL的常见参数和技巧
墨墨导读:本文主要详述PostgreSQL的常见参数以及一些技巧. 1. psql命令 1.1 General options 1.1.1- ? 我们可以psql -?或者psql --help看下p ...
- 使用 Hasura 和 PostgreSQL 构建后端技巧你会吗
后端开发通常需要编写多行代码来处理 CRUD.授权和业务逻辑.所有这些代码都需要在项目的整个生命周期内进行测试.调试和维护.这需要开发人员可以用来开发新功能的大量时间.在本文中,您将了解 Hasura ...
- PostgreSQL常用SQL优化技巧
PostgreSQL的SQL优化技巧其实和大多数使用CBO优化器的数据库类似,因此一些常用的SQL优化改写技巧在PostgreSQL也是能够使用的.当然也会有一些不同的地方,今天我们来看看一些在Pos ...
- PostgreSQL学习笔记10之性能提升技巧
一.使用EXPLAIN: PostgreSQL为每个查询都生成一个查询规划,因为选择正确的查询路径对性能的影响是极为关键的.PostgreSQL本身已经包含了一个规划器用于寻找最优规划,我们可以通过使 ...
- 基于物化视图优化_「PostgreSQL技巧」PostgreSQL中的物化视图与汇总表比较
多年来,物化视图一直是Postgres期待已久的功能.他们最终到达了Postgres 9.3,尽管当时很有限.在Postgres 9.3中,当刷新实例化视图时,它将在刷新时在表上保持锁定.如果您的工作 ...
- postgresql数据库迁移技巧(降低版本迁移到GreenPlum pg11-pg8)
工具:navicat12 步骤: 1.创建scheme 2.导出源scheme的结构sql 3.在目标数据库执行源scheme结构sql中创建序列部分 4.直接操作拷贝scheme所有表(使用生成sq ...
- PostgreSQL的查询技巧: 零除, GENERATED STORED, COUNT DISTINCT, JOIN和数组LIKE
- MySql Povit,[MySQL|Postgresql] Pivot 通用技巧
在Oracle和 SQLServer 都有現成的PIvot樞紐分析函式可以用 在MySQL 中如果要使用 樞紐分析 怎麼辦... 今天和大家分享如何在MySQL中使用樞紐分析 案例樣本資料: CREA ...
最新文章
- linux pcre-devel,ubuntu - 我应该为'pcre-devel'安装什么软件包? - Ubuntu问答
- 独家 | 如何手动优化神经网络模型(附链接)
- mysql批量加逗号_批量插入数据到数据库的方式
- ajax跨域请求Flask后台
- 机器学习知识总结系列- 特征工程(1-1)
- jQuery - 按回车键触发跳转
- c语言怎么把数字倒过来_c语言中如何实现输入一个整数实现倒序输出
- 图论:Gale-Shapley算法
- ACE admin 后台管理框架
- android按钮延迟显示出来,android Toast显示延迟的优化方案
- 关于操作系统镜像超过4G的解决办法
- Unity 透视相机世界和屏幕坐标系转换
- word2010设置护眼背景
- javascript 代码转换为 typescript 代码
- 空间两直线间最短距离计算公式
- 【论文笔记】AVSM:结合了仿射配准和vSVF配准的医学图像配准模型
- 关于ES自定义script painless的问题
- nz-zorro 主题切换 动态
- 身为iOS开发,你是愿意在大公司做凤尾,还是在小公司做鸡头?
- Provision,webservice怎么接收dsmp发过来的包?