Oracle与PostgreSQL使用差异对比与总结_little沫沫的博客-程序员宝宝

技术标签: oracle  postgreSQL  使用差异  SQL  

JDBC连接:

Oracle的jdbc连接字符串:db.url=jdbc:oracle:thin:@192.168.1.1:1521:ORCL

Postgresql的连接字符串:db.url=jdbc:postgresql:@192.168.1.1:5432/database

1、基本数据类型差异

Oracle PostgreSQL
Varchar2 varchar
number numeric
date timestamp/date/time
不支持boolean,可通过0/1代替 支持boolean
null null

2、基本函数差异

item Oracle PostgreSQL
系统当前时间 SYSDATE

now()/CURRENT_TIMESTAMP/CURRENT_DATE/CURRENT_TIME

对时间或数字截取 trunc() date_trunc()
to_char,to_number, 
to_date
自动格式转换

需指定日期格式

eg:to_date(timejoin,'yyyy-MM-dd')

判空操作 nvl() coalesce()
条件判断 decode() case...when...then
dual伪表 支持 不支持(查询常量不需要加from)

 其他用法一致的常用函数:

mod(n2,n1) -- n2除n1取余数;          sign(n) -- 判断n的符号;

floor(n) -- 取小于等于n的正整数;     ceil() -- 取大于等于n的正整数;

round(n,integer) -- 对n四舍五入,保留位数为integer;   trunc(n,integer) -- 对n截取,截取保留的位数为integer;

covert(char,dest_sest,source_set) -- 字符集转换,例:convert(username, 'ZHS16GBK','UTF8');

cast(expr as type_name) -- 数据类型转换,常用于数字与字符间转换,例:cast(id_no as varchar);

 部分函数的使用简析:

(1)coalesce(COL1,COL2,COL3):返回参数中第一个非null字段值

例如:coalesce(COL1,0):如果COL1为null或‘’,则返回默认值0;否则返回COL1的值;

(2)extract(date):对日期特定部分提取(oracle和postgresql使用一致)

例如:extract(year from now());>>>2018    
            extract(month from now());>>>9
            extract(month from timestamp '2018-09-10 13:59:59');>>>9

(3)对时间截取trunc()和date_trunc()

>>oracle--trunc()的用法:
trunc(sysdate,'yyyy');//返回当前年的第一天>>>2018-01-01
trunc(sysdate, 'mm');//返回当前月的第一天>>>2018-09-01
trunc(sysdate, 'dd');//返回当前时间的年月日>>>2018-09-14
trunc(sysdate, 'hh');//返回当前小时>>>2018-09-14 13:30:50

>>postgreSQL--date_trunc()用法:                                                                                                                                 
date_trunc('year',now());//返回当前时间年的第一天>>>2018-01-01 00:00:00
date_trunc('month',now());//返回当前月的第一天>>2018-09-01 00:00:00
date_trunc('day',now()); //返回当前时间的年月日>>2018-09-14 00:00:00             
date_trunc('second',now()); //返回当前时间的年月日时分秒>>2018-09-14 13:30:50                                                          

(3)条件判断

Oracle:
  Select DECODE (payments_info,'CR','Credit','DB','Debit', null) FROM dual;
PostgreSQL:
  Select CASE
      WHEN foo = 'CR'   THEN 'Credit'
      WHEN foo = 'DB'   THEN 'Debit'
      ELSE 'default'
  END
  FROM t2;

3、DDL语法差异

oracle和pgSQL操作表结构语法基本一致:

修改表名:alter table tbl_user rename tbl_user2;

添加约束:alter table 表名 add constraint 表名_列名_nn check (is not null)

添加列:alter table tbl_user add age number(3) default 18 not null;

                alter table tbl_user add age number(3) default 18 not null after sex;(在指定列后添加列

删除列:alter table tbl_user drop column age;

修改列:alter table tbl_user modify password default'000000' not null;(修改约束)

修改列名:alter table tbl_user rename column password to pwd;

只有更改列的数据类型写法有些差异

Oracle:ALTER TABLE table_name modify column_name datatype; 

PostgreSQL:ALTER TABLE table_name ALTER column_name TYPE datatype; 

4、DML语法差异

oracle和pgSQL增删改查语法基本一致,只有upsert有差异

Oracle:有自带的merge into功能(一个强大的操作)

PostgreSQL:不支持merge操作,可以使用on conflict() do

例:insert into TargetTable

                    select id,desc

                    from SourceTable

        on conflict (id)

        do update set

                   desc = exclude.desc

5、查询语句差异

(1)查询表中最新n条数据(Oracle有rownum,postgreSQL有limit

postgreSQL:

select * from olc.olc_member_intebid_info order by create_time desc limit n;

注意:limit必须用于 order by 之后

Oracle:

写法一:select t.* from (select * from nwd.tc_inte_bid_record order by create_time desc) t where rownum <= n;

写法二:select * from(select t.*, row_number() over(order by create_time desc) rn from nwd.tc_inte_bid_record t) where rn <=n;

上述写法一为通用常规写法;写法二可以对分组后数据排序,分组语句写在over()中

(2)子查询

postgresql子查询要求比较严格,必须具有别名才可以

6、 Postgresql命令行常用操作(psql)

psql -d dbname -U username -p 5210 -h 172.0.0.1
--password 's&cws123'

如果不想输入密码,可以在.pgpass隐藏文件中添加密码,格式:
172.0.0.1:5210:dbname:username:password
注意.pgpass的权限问题:
chmod 0600 ~/.pgpass

-- 查询某个库下的所有表(\dt
select * from pg_tables where schemaname = 'idn_dw';

-- 查询某个存储过程(\df
select proname,prosrc from pg_proc where proname = 'func_dwd_customer_info';

-- 查询某个表下的字段(\d tablen_ame
select table_schema,table_name,t.colname,string_agg(column_name,',') as COLS 
from information_schema.columns
LEFT JOIN (select pg_class.relname as tablename,pg_attribute.attname as colname from
pg_constraint inner join pg_class
on pg_constraint.conrelid = pg_class.oid
inner join pg_attribute on pg_attribute.attrelid = pg_class.oid
and pg_attribute.attnum = pg_constraint.conkey[1]
where pg_constraint.contype='p') t
on table_name=t.tablename
where TABLE_NAME = 's10_anfd_rule'
group by table_schema,table_name,t.colname;

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/super_tianxinmomo/article/details/81093953

智能推荐

比较Vector,List 和ArrayList间的区别_痴心笨笨的博客-程序员宝宝

关于这三种容器类型的数据结构存在一些区别,在应用的时候在空间分配和数据存储结构上有些不同.线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。Collection├List│├LinkedList│├Arr

.net源码解读之StringBuilder-程序员宝宝

.net源码下载:https://referencesource.microsoft.com/在解析StringBuilder的源码之前,先贴出StringBuilder的微软官方源码:public sealed class StringBuilder : ISerializable { // A StringBuilder is internally represented as a linked list of blocks each of which holds /

Simulink Test笔记(含一些小技巧)二_simulinktest变量定义_WowMannix的博客-程序员宝宝

说明本文记录simulink test在使用过程中的心得,包含使用过程中新的发现及提高测试效率的一些技巧。本文提到的内容均基于以下运行环境:MATLAB   版本 9.3 (R2017b)Simulink   版本 9.0 (R2017b)Win10系统1、simulink test 测试结果如何显示出输入/输出变量的曲线应用场景:运行失败的用例,通过对比输入/输...

【剖析】上拉电阻和下拉电阻原理及其作用_张巧龙的博客-程序员宝宝

电阻在电路中起限制电流的作用。上拉电阻和下拉电阻是经常提到也是经常用到的电阻。在每个系统的设计中都用到了大量的上拉电阻和下拉电阻。在上拉电阻和下拉电阻的电路中,经常有的疑...

MySQL误操作UPDATE某张表的数据, 恢复UPDATE前的数据(Java提取SQL进行恢复)_不小心更新了表数据_a_a\\\的博客-程序员宝宝

MySQL误操作过程1 事件背景2 恢复环境准备2.1 MySQL的操作日志2.2 MySQL的解析日志工具3 恢复过程3.1 mysqlBinlog工具解析日志文件3.2 提取sql语句恢复1 事件背景由于使用工具统一查看生产数据库和测试数据库,在生产数据库打开查询后,忘记关掉。在本地测试更改数据进行测试,误操作了UPDATE生产环境的某张表创建数据.误操作语句为:UPDATE TAB...

在linux centos7安装weblogic12_centos 安装weblogic 12_Hi竹子的博客-程序员宝宝

1.准备软件1)安装包下载:fmw_12.1.3.0.0_wls.jar 提取码:yv212)jdk下载:jdk-7u51-linux-x64.tar.gz 提取码:ngrn友好提示:最好安装我给的jdk和安装包安装。2.安装2.1.安装jdkjdk安装请看《Linux(CentOS7)中安装JDK》文章。友好提示:配置好环境变量2.2.安装weblogic2.2.1. 安装前配置2.2.1.1.创建用户组#创建组groupadd weblogic#创建用户主目录mkdir /

随便推点

计算机系统基础知识_体系结构及指令_sime 单指令_GarfieldGCat的博客-程序员宝宝

文章目录概述计算机体系结构分类指令系统指令集体系结构的分类CISC和RISC复杂指令集计算机(Complex Instruction Set Computer)精简指令集计算机(Reduced Instruction Set Computer)指令优化指令的流水线流水(Pipelining)流水的分类流水相关的处理方式流水技术流水吞吐率与建立时间概述1964年,阿姆达尔(G.M.Amdahl)...

YOLOX训练自己的VOC标注的数据_yolox下的voc模型训练_DaneAI的博客-程序员宝宝

0. 前言YOLOX是旷世在YOLO的基础上将anchor-free技术引入,从性能和速度上取得的更好的结果。具体可参考github相关代码及论文说明,此处介绍如何利用YOLOX训练自己的VOC数据集。github:https://github.com/Megvii-BaseDetection/YOLOXpaper:https://arxiv.org/abs/2107.084301.环境配置参考github上相关说明。1)安装YOLOXconda create -n yolox

svchost.exe详解_sense5的博客-程序员宝宝

svchost.exe是nt核心系统的非常重要的进程,对于2000、xp来说,不可或缺。很多病毒、木马也会调用它。所以,深入了解这个程序,是玩电脑的必修课之一。  大家对windows操作系统一定不陌生,但你是否注意到系统中“svchost.exe”这个文件呢?细心的朋友会发现windows中存在多个 “svchost”进程(通过“ctrl+alt+del”键打开任务管理器,这里的“进程”标签

使用Delphi 编写Python Extension_djcsch2001的博客-程序员宝宝

转使用Delphi 编写Python Extension使用Delphi 编写Python Extension作者:1000copy摘要:在互联网公共可访问领域内,关于Python/C interface的介绍,手册都是比较多的。Py直接支持C编写扩展,对于Delphi程序员,P4D是一个很好的选择。不幸的是,通过P4D[2]编写PyExtention,并没有一个很好的入门文档

Java8 Stream groupingBy对List进行分组_list groupingby_赶紧去巡山的博客-程序员宝宝

Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组数据准备:public Product(Long id, Integer num, BigDecimal price, String name, String category) { this.id = id; this.num = num; this.price = price; this.name = name; this.category = category;}Product prod1 =

虚拟机ubantu系统崩溃s001.vmdk”所在的文件系统已满_ubuntu s001_Tomcatcn的博客-程序员宝宝

问题s001.vmdk”所在的文件系统已满。 选择“重试(R)”可重试该操作。 选择“取消”将结在下载docker镜像时候,提示虚拟硬盘空间不足,点击取消,就会退出系统,如果再打开系统,还是会一直出现这个提示解决办法打开你存放虚拟机系统文件的文件夹。然后以下面关键字搜索这个文件夹:*.lck。删除所有找到的就可以了。...

推荐文章

热门文章

相关标签