postgre常用函数

本文介绍了如何在PostgreSQL中查看和管理进程,包括查询和终止进程的方法。此外,还展示了查询表磁盘占用、数据类型转换从Oracle到PG的规则,以及如何进行递归查询。同时,提到了排序、行转列和索引操作的相关SQL语法。
摘要由CSDN通过智能技术生成

pg查进程

--pg库查进程
select pid, state, usename, query, query_start
from pg_stat_activity
where pid in (
    select pid from pg_locks l
                        join pg_class t on l.relation = t.oid
        and t.relkind = 'r'

);

--pg杀进程
SELECT pg_terminate_backend(pid);

pg查看表占磁盘大小

--查看所有表所占磁盘空间大小
select sum(t.size) from (
SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
) t


--查看每个表所占用磁盘空间大小
SELECT table_schema || '.' || table_name AS table_full_name, pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC

orcle转pg

CHAR(n)------>CHAR(n)
VARCHAR2(n)------>varchar(n)
NUMBER(n, m) ----->NUMERIC(n, m)
NUMBER(4)----->SMALLINT
NUMBER(9)----->INT
NUMBER(18)----->BIGINT
NUMBER(n)----->NUMERIC(n) --如果n大于19,则可以转换为numeric类型
DATE----->TIMESTAMP(0)
CLOB----->TEXT
TIMESTAMP WITH LOCAL TIME ZONE ------>TIMESTAMPTZ

numer(3,2) 表示总位数3,其中小数点右边2,例如 3.14
substr('abcdef',1,4) 从第1位开始,截取4位
cast(xxx as varchar) 

递归查询

--向上查询
with RECURSIVE up_temp AS ( 
       SELECT * FROM  tb WHERE id =1
     union all 
       SELECT a.* 					--a.子=b.父
	   FROM tb a, up_temp b WHERE a.id = b.parentid
	)
 SELECT * FROM up_temp;
 
 
 --向下查询
 with RECURSIVE down_tmp AS ( 
       SELECT * FROM tb WHERE id =2
     union all									--a.父=b.子
       SELECT a.* FROM tb a, down_tmp b WHERE a.parentid = b.id
	)
 SELECT * FROM down_tmp;
 

指定排序(case when)

--  因为PostgreSql没有order by field 可以使用case when then进行排序


SELECT stage, pln_status
FROM project
ORDER BY CASE 
	WHEN pln_status = '规划' THEN 1
	WHEN pln_status = '初选' THEN 2
	WHEN pln_status = '查勘' THEN 3
	WHEN pln_status = '评审' THEN 4
	WHEN pln_status = '批复' THEN 5
	WHEN pln_status = '初设' THEN 6
	WHEN pln_status = '开工' THEN 7
END

PostgreSQL多行变一行

string_agg(字段名,分隔符)

postgres=# select name,string_agg(tag,',' order by id_num asc) from book2 group by name;
 name | string_agg 
------+------------
 C++  | dd,ee
 java | aa,bb,cc
(2 rows)


array_agg(字段名)

select name,array_agg(tag) from tb3 group by name;

 name | array_agg  
------+------------
 c++  | {dd,ee}
 java | {aa,bb,cc}

 
select name,array_to_string(array_agg(tag),',') from tb3 group by name;

 name | array_to_string 
------+-----------------
 c++  | dd,ee
 java | aa,bb,cc

over() partition by order by

-- count(1) OVER(PARTITION BY a ORDER BY a) AS count,是按a进行分组且组内按a进行升序,统计组内记录的条数。
-- row_number() OVER(PARTITION BY a ORDER BY a) AS rownum,是按a进行分组且组内按a进行升序,返回组内行编号。

select name,area,level,
row_number() OVER(PARTITION BY name ORDER BY level) AS rownum
from tb1;

行转列

原始数据

nameaddressage
a1A12

目标结果

c1c2
namea1
addressA
age12
--concat_ws拼接
select name,address,concat_ws('#',name,address) from tb1;

--行转列(带上列名)
SELECT
	regexp_split_to_table( concat_ws ( ',', 'name', 'address','age' ), ',' ) age_type,
	regexp_split_to_table(concat_ws(',',coalesce("name",'无'),coalesce("address",'无'),coalesce("age",'无')),',') age_rate 
FROM
	tb1;
--结果:	
--	age_type	age_rate
--	name		a1
--	address		A
--	age			12

索引

--创建
create index idx_test01 on tb1;

--组合索引
create index idx_test02 on tb2 (c1,c2);

--唯一索引
create unique idex idx_test03 on tb3 (c1)

--删除索引
drop index

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值