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表

pg_attribute

pg_description

修改表结构中的数据类型

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

避免插入重复数据

  1. 唯一约束
    ALTER TABLE par_service_sql_desc_iss ADD CONSTRAINT unique_serviceName_flag_sqlDesc UNIQUE(service_name,flag,sql_desc)

PostgreSQL 添加各种约束语法

字段是关键字

在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是子查询的列还是主查询的列。
      
posted @ 2021-07-15 17:28  香草味的薄荷糖  阅读(161)  评论(0)    收藏  举报