postgresql使用记录
Navicat问题
Navicat 远程连接之后,无法使用 psql 特殊命令,查询表结构还得在查询中使用sql语句
查询表结构语句
SELECT a.attnum,
a.attname AS field,
t.typname AS type,
a.attlen AS length,
a.atttypmod AS lengthvar,
a.attnotnull AS notnull,
b.description AS comment
FROM pg_class c,
pg_attribute a
LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,
pg_type t
WHERE c.relname = 'par_service_sql_desc_iss' -- 替换为你的表名
and a.attnum > 0
and a.attrelid = c.oid
and a.atttypid = t.oid
ORDER BY a.attnum;
对其中的重要的表做些介绍
系统表官方文档
pg_class
记录了数据库中的表,索引,序列,视图("关系")。
其中比较重要字段有:
- relname 表,索引,视图等的名字。
- relnamespace 包含这个关系的名字空间(模式)的 OID,对应pg_namespace.oid
- relkind r = 普通表,i = 索引,S = 序列,v = 视图, c = 复合类型,s = 特殊,t = TOAST表
修改表结构中的数据类型
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
避免插入重复数据
- 唯一约束
ALTER TABLE par_service_sql_desc_iss ADD CONSTRAINT unique_serviceName_flag_sqlDesc UNIQUE(service_name,flag,sql_desc)
字段是关键字
在mysql中:
加上 `` ,如 select
desc from user_info
在postgresql中
加上"" , 如 select "desc" from user_info
NVL函数
oracle:
作用:从两个表达式中返回一个非空的表达式
语法:NVL(eExpression1, eExpression2)
返回值:字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值
常用方式:select nvl(a.name,'空得') as name from student a join school b on a.ID=b.ID
```复制代码
SELECT T.D_FDATE,
T.VC_ZHCODE,
NVL(SUM(T.F_FZQSZ), 0) f_price_b,
NVL(SUM(T.F_FZQCB), 0) f_cost_b,
NVL(SUM(T.F_FGZ_ZZ), 0) f_gz_b,
NVL(SUM(T.F_FYZQSZ), 0) f_price_Y,
NVL(SUM(T.F_FYZQCB), 0) f_cost_Y,
NVL(SUM(T.F_FYGZ_ZZ), 0) f_gz_Y,
T.VC_SOURCE,
SYSDATE d_updatetime
FROM GZ_FUND_GZB T ```
比如这样的判断就很重要啦,因为你不知道哪一行是 is not null 的,也不知道接下来是否要对这个单元格进行运算操作,因此,不能给列填 null,就给它一个 0 ,便于查看,也便于运算。
postgreSql中类似NVL的函数 :coalesce 函数
用法:SELECT coalesce(collect_result,0) as collect_result FROM collect
oracle中的replace函数
作用:替换指定字符串中的字符
语法:replace(string, char , char)
实例:```
select replace('0123456789','0','a') from dual;--a123456789
select replace('0123456789','0','') from dual;--123456789
select replace('0123456789','0') from dual;--123456789
## oracle的rownum与row_number
### oracle中rownum
作用:用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
场景一:rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
```SQL> select rownum,id,name from student where rownum=1; --有记录
SQL> select rownum,id,name from student where rownum =2; --无记录```
场景二:rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。