设为首页 收藏本站
查看: 841|回复: 0

[经验分享] PostgreSQL和Oracle用法上的一些区别

[复制链接]

尚未签到

发表于 2018-9-23 07:20:03 | 显示全部楼层 |阅读模式
  (1 ) 注意增加约束时的写法,和ORACLE 略有不同
Oracle

ALTER TABLE SCHEMA.PREFIX_INFO ADD (

  CONSTRAINT PK_PREFIX_INFO PRIMARY KEY (INFO_ID));
PostgresQL

alter table schema.prefix_info add constraint prefix_info_pkey primary key(info_id);

(2 )系统默认的最大值与ORACLE 不同

Oracle

CREATE SEQUENCE PREFIX_INFO_SEQUENCE

  INCREMENT BY 1
  START WITH 582
  MINVALUE 1
  MAXVALUE 9999999999999999999999999999
  NOCYCLE
  CACHE 20
  NOORDER;
PostgresQL

CREATE SEQUENCE schema.prefix_info_sequence

  increment 1
  minvalue 1
  maxvalue 9223372036854775807
  start 582
  cache 20;
(3 )PostgresQL 中的 || 用 法与其他数据库不同:

  select a|| b from table1;
  当a 或b 其中一个为null 时, 该查询返回null ,
(4 )PostgresQL 中没有concat 函数,且由于|| 用法的问题,无法使用|| 替换,解决 方法为在public schema 中创建函数concat

create or replace function concat(text, text)

  returns text as
  $body$select coalesce($1,'') || coalesce($2,'')$body$
  language 'sql' volatile;
  alter function concat(text, text) owner to postgres;
-- 无需特殊授权即可在其他schema 中使用

(4 )PostgresQL 中没有dual 虚拟表,为保 证程序兼容性,可创建伪视图(view )替代:

CREATE OR REPLACE VIEW dual AS

  SELECT NULL::"unknown"
  WHERE 1 = 1;
ALTER TABLE dual OWNER TO postgres;

  GRANT ALL ON TABLE dual TO postgres;
  GRANT SELECT ON TABLE dual TO public;
必须授权public 以select 权 限

(5 )关联查询用法区别

ORACLE:

简单外连接:

  SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
  SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B
  WHERE 1 = 1
  AND A.COL2 = B.COL2(+)
  AND A.COL3 > 0
  AND A.COL4 = '1'
超级变态外连接:

  SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
  SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B,SCHEMA.PREFIX_TABLE3 C,SCHEMA.PREFIX_TABLE4 D
  WHERE 1 = 1
  AND A.COL2 = B.COL2
  AND A.COL3 = C.COL3(+)
  AND A.COL4 = D.COL4(+)
  AND A.COL5 > 0
  AND A.COL6 = '1'

  POSTGRESQL:
简单外连接:

  select count(distinct(a.col1)) as rcount from
  schema.prefix_table1 a left outer join schema.prefix_table2 b on (a.col2 = b.col2)
  where 1 = 1
  and a.col3 > 0
  and a.col4 = '1'
超级变态外连接:

  select count(distinct(a.col1)) as rcount from
  schema.prefix_table1 a inner join schema.prefix_table2 b on (a.col2 = b.col2)
  left outer join schema.prefix_table3 c on (a.col3 = c.col3)
  left outer join schema.prefix_table4 d on (a.col4 = d.col4)
  where 1 = 1
  and a.col5 > 0
  and a.col6 = '1'
(6 )PostgresQL 中子查询较为规范,子查询结果集必须拥有alias

ORACLE:

  SELECT * FROM (
  SELECT * FROM (
  SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1
  ) WHERE X=1 ORDER BY COL2
  ) WHERE Y=2 ORDER BY COL3
POSTGRESQL:

SELECT * FROM (

  SELECT * FROM (
  SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1 ALIAS1
  ) WHERE X=1 ORDER BY COL2 ALIAS2
  ) WHERE Y=2 ORDER BY COL3
(7 ) PostgresQL 中没有rownum ,无法 使用where rownum < = X 的方法进行分页,取而代之的是limit X ,offset Y 方法, 而ORACLE 中不允许使用LIMIT X 的 方法

  ORACLE:
SELECT * FROM ( SELECT * FROM (SELECT * FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) where ROWNUM

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600064-1-1.html 上篇帖子: oracle中to_date函数详解 下篇帖子: Oracle含有时区功能的timestamp类型简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表