`
jasonw68
  • 浏览: 154281 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转发)PostgreSQL 与 Oracle 相异点

    博客分类:
  • SQL
 
阅读更多

前段时间做了一个数据库移植的项目,对Oracle SQL 转化为PostgreSQL 有了一点了解。现将项目中遇到的一些相异点,一一分享,共同提高,共同进步。

ORACLE 与 PostgreSQL 相异点
NO 问题点 Oracle PostgreSQL
1 DUAL SELECT 1+1 FROM DUAL SELECT  1+1
或者
CREATE VIEW dual AS
      SELECT 'X'::VARCHAR(1) AS DUMMY
再 SELECT 1+1 FROM DUAL
2 NEXTVAL SELECT A_TABLE_SEQUENCE.NEXTVAL
FROM   DUAL
SELECT NEXTVAL('A_TABLE_SEQUENCE')
FROM   DUAL
3 ROWNUM ①SELECT *
FROM  AGE_TYPE
WHERE ROWNUM<=5
①SELECT *
FROM AGE_TYPE
LIMIT 5 OFFSET 0
②SELECT *
FROM AGE_TYPE
WHERE CODE IS NOT NULL
AND ROWNUM<=5
ORDER BY CODE DESC
②SELECT  *
FROM
AGE_TYPE
WHERE CODE IS NOT NULL
ORDER BY CODE DESC
LIMIT 5 OFFSET 0
4 (+) ①SELECT *
FROM A_TABLE A , B_TABLE B
WHERE A.ID(+)=B.ID
①SELECT *
FROM A_TABLE A
RIGHT OUTER JOIN
B_TABLE B
ON A.ID=B.ID
②SELECT *
FROM A_TABLE A , B_TABLE B
WHERE A.ID(+)=B.ID
AND A.COL1='COL1_VALUE'
②SELECT *
FROM A_TABLE A
RIGHT OUTER JOIN B_TABLE B
ON A.ID=B.ID AND A.COL1='COL1_VALUE'
③SELECT *
FROM A_TABLE A, B_TABLE B,C_TABLE C,D_TABLE D
WHERE
A.ID=B.ID(+) AND
A.ID=C.ID(+) AND
A.COL1=D.COL1
③SELECT *
FROM (A_TABLE A
LEFT OUTER JOIN B_TABLE B
ON A.ID=B.ID)
LEFT OUTER JOIN C_TABLE C
ON A.ID=C.ID,D_TABLE D
WHERE A.COL1=D.COL1
④!!!
SELECT *
FROM A_TABLE A
WHERE A.COL1(+)=0 AND
  A.COL2(+) ='A_VALUE2'
④!!!
SELECT *
FROM A_TABLE A
WHERE A.COL1=0 AND
  A.COL2='A_VALUE2'
WHERE (A.COL1=0 OR A.COL1 IS NULL) AND
  (A.COL2='A_VALUE2' OR A.COL2 IS NULL)
5 AS SELECT A.COL1  A_COL1,
           A.COL2  A_COL2
FROM A_TABLE A
SELECT A.COL1 AS A_COL1,
           A.COL2 AS A_COL2
FROM A_TABLE A
6 NVL SELECT NVL(SUM(VALUE11),0) FS_VALUE1,
            NVL(SUM(VALUE21),0) FS_VALUE2
FROM   FIELD_SUM 
SELECT COALESCE(SUM(VALUE11),0) AS FS_VALUE1,
           COALESCE(SUM(VALUE21),0) AS FS_VALUE2
FROM   FIELD_SUM 
7 TO_
NUMBER
SELECT COL1
FROM A_TABLE
ORDER BY TO_NUMBER(COL1)
SELECT COL1
FROM A_TABLE
ORDER BY TO_NUMBER(COL1,999999)
[注:'999999' ---- 6位数
COL1字段的 度]
8 DECODE SELECT DECODE(ENDFLAG,'1','A','B') ENDFLAG
FROM  TEST
SELECT
(CASE ENDFLAG
WHEN '1' THEN 'A'
ELSE '
B ' END) AS ENDFLAG
FROM TEST
9 时间
问题
UPDATE A_TABLE
SET ENTREDATE= SYSDATE
UPDATE A_TABLE
SET ENTREDATE=TO_TIMESTAMP(CURRENT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS')
或者
UPDATE A_TABLE
SET ENTREDATE=CURRENT_TIMESTAMP
SELECT TO_DATE('20010203','YYYY-MM-DD') AS DAY
FROM DUAL
SELECT TO_DATE('20010203','YYYYMMDD') AS DAY
FROM DUAL

SELECT TO_DATE('20010203','YYYY-MM-DD') AS DAY
FROM DUAL
SELECT TO_DATE(SYSDATE ,'YYYY-MM-DD') AS DAY
FROM DUAL
SELECT TO_DATE(CURRENT_DATE,'YYYY-MM-DD') AS DAY
FROM DUAL
SELECT TO_DATE(SYSDATE ,'YYYY/MM/DD') AS DAY
FROM DUAL
SELECT TO_DATE(CURRENT_DATE,'YYYY/MM/DD') AS DAY
FROM DUAL
10 || SELECT NULL||'-'||NULL AS VALUES1
FROM DUAL
SELECT COALESCE(NULL,'')||'-'||COALESCE(NULL,'') AS VALUES1
FROM DUAL
SELECT NULL||'-' ||NULL AS VALUES1
FROM DUAL
11 aggregate SELECT ROUND(AVG(SUM(BASICCNT1))) BASICCNT
FROM   ACCESS_INFO_SUM1_V
WHERE YEARCODE BETWEEN '200305' AND '200505'
GROUP BY SCCODE
SELECT  ROUND(AVG(AIV.BASICCNT)) AS BASICCNT
FROM
    (SELECT SUM(BASICCNT1)      AS BASICCNT
    FROM   ACCESS_INFO_SUM1_V
    WHERE YEARCODE BETWEEN '200305' AND '200505'
    GROUP BY sccode
     ) AIV
12 「"」 ①SELECT LENGTH('') AS VALUE1 FROM DUAL
[Result]VALUE1=NULL
①SELECT LENGTH('') AS VALUE1 FROM DUAL
[Result]VALUE1=0
②SELECT TO_DATE('','YYYYMMDD') AS VALUE2
FROM DUAL
[Result]VALUE2=NULL
②SELECT TO_DATE('','YYYYMMDD') AS VALUE2
FROM DUAL
[Result]VALUE2=0001-01-01 BC
③SELECT TO_NUMBER('',1) AS VALUE3 FROM DUAL
[Result]VALUE3=NULL
③SELECT TO_NUMBER('',1) AS VALUE3 FROM DUAL
[Result]不能
④INSERT INTO TEST(VALUE4)VALUES('')
[Result]VALUE4=NULL (注:VALUE3字段
型)
④INSERT INTO TEST(VALUE4)VALUES('')
[Result]VALUE4=0
  (注:VALUE4字段
型)
⑤INSERT INTO TEST(VALUE5)VALUES('')
[Result]VALUE5=NULL (注:VALUE5字段
字符 型)
⑤INSERT INTO TEST(VALUE5)VALUES('')
[Result]VALUE5=''
  (注:VALUE5字段
字符 型, 结果为长度为零的字符串 )
⑥INSERT INTO TEST(VALUE6)VALUES(TO_DATE('','YYYYMMDD'))
[Result]VALUE6=NULL (注:VALUE6字段
为时间类 型)
⑥INSERT INTO TEST(VALUE6)VALUES(TO_DATE('','YYYYMMDD'))
[Result]VALUE6=0001-01-01 BC
  (注:VALUE7字段
为时间类 型)
13 CEIL SELECT CEIL(SYSDATE - TO_DATE('20051027 14:56:10','YYYYMMDD HH24:MI:SS')) AS DAYS
FROM DUAL
SELECT
EXTRACT(DAY FROM (TO_TIMESTAMP(CURRENT_TIMESTAMP,'YYYY-MM-DD-HH24-MI-SS') -TO_TIMESTAMP('2005-10-27 14:56:10','YYYY-MM-DD-HH24-MI-SS') ))+1 AS DAYS
FROM DUAL
14 NULLIF 无 NULLIF函数 SELECT NULLIF(VALUE1,VALUE2) AS COL1 FROM DUAL
[注]当 VALUE1=VALUE2
时,COL1=NULL
15 CONCAT CONCAT(CHAR,CHAR) 创建函数来解决
CREATE FUNCTION CONCAT(CHAR,CHAR)
RETURNS CHAR AS
        'SELECT $1 || $2' LANGUAGE 'sql';
16 ADD_
MONTHS
add_months(date, int) 建函数来解决
CREATE FUNCTION add_months(date, int)
RETURNS date AS
'SELECT ($1 + ( $2::text || ''months'')::interval)::date;'
LANGUAGE 'sql'
17 LAST
_DAY
LAST_DAY(DATE) 建函数来解决
CREATE FUNCTION LAST_DAY(DATE)
RETURNS DATE AS
        'SELECT date(substr(text($1 +
                interval(''1 month'')),1,7)||''-01'')-1'
        LANGUAGE 'sql';
18 MONTHS
_BETWEEN
MONTH_BETWEEN(DATA,DATA) 建函数来解决
CREATE FUNCTION MONTH_BETWEEN(DATA,DATA)
RETURNS NUMERIC AS
        'SELECT to_number((date($1)-
                           date($2)),''999999999'')/31'
        LANGUAGE 'sql';
19 GRE~
ATEST
GREATEST (LEAST) 建函数来解决
CREATE OR REPLACE FUNCTION
   GREATEST(TEXT[]) RETURNS TEXT AS '
DECLARE
   ARRY ALIAS FOR $1;
   GREATEST TEXT;
BEGIN
   GREATEST := ARRY[1];
   FOR I IN 1 .. ARRAY_UPPER(ARRY,1) LOOP
      IF ARRY[I] > GREATEST THEN
        GREATEST := ARRY[I];
      END IF;
   END LOOP;
   RETURN GREATEST;
END;
' LANGUAGE 'PLPGSQL';

SELECT GREATEST( ARRAY['HARRY','HARRIOT','HAROLD'])
AS "Greatest";
20 BITAND BITAND(int,int) SELECT 値 & 値;
21 子条件   在FROM子条件中字段 须有列名,
处理方法用AS +别名
22 MINUS MINUS 以EXCEPT来替代
23 BIN_
TO_
NUM
SELECT BIN_TO_NUM(1,0,1,0) AS VALUE1 FROM DUAL SELECT CAST(B'1010' AS INTEGER) AS VALUE1
分享到:
评论

相关推荐

    MySQL、PostgreSQL、Oracle比较及数据库基础知识

    MySQL、PostgreSQL、Oracle比较; 数据库基础知识.ppt

    Postgresql连接oracle驱动并实现读写

    这种方式极大地扩展了PostgreSQL的功能,并提供了与Oracle数据库交互的能力,对于需要跨数据库平台工作的场景非常有用。需要注意的是,在实际部署过程中,可能还会遇到各种具体环境下的兼容性和配置问题,需要根据...

    postgresql 兼容 oracle 函数

    为了使PostgreSQL更加Oracle友好,社区开发了一些扩展,例如"orafce"(Oracle Functions for PostgreSQL)项目,这个项目的主要目标就是提供一个与Oracle兼容的函数库,使得PostgreSQL能更好地支持Oracle的语法和...

    PostgreSQL & Oracle-备份恢复技术大比拼

    2. PostgreSQL与Oracle在逻辑备份与恢复方面的技术差异 3. PostgreSQL与Oracle在物理备份与恢复方面的技术差异 4. PostgreSQL与Oracle的闪回技术对比 5. PostgreSQL与Oracle中逻辑备份工具的使用方法 6. PostgreSQL...

    PostgreSQL和Oracle区别

    标题和描述中提到的知识点是关于PostgreSQL和Oracle在特定功能和语法上的区别,下面将对这些关键点进行深入解析: ### 1. 增加约束的方式 **Oracle**和**PostgreSQL**在添加主键约束时的语法有所不同: - **Oracle...

    PostgreSQL與Oracle跟SQL92 Standard的差異

    在探讨《PostgreSQL与Oracle跟SQL92 Standard的差异》这一主题时,我们主要关注的是三种数据库管理系统在数据类型上的不同之处。这篇文章由许雅婷撰写,作为高等数据库作业的一部分,详细对比了PostgreSQL、Oracle...

    JDBC.rar_jdbc PostgreSQL_oracle_postgresql

    标题中的“JDBC.rar_jdbc PostgreSQL_oracle_postgresql”表明这个压缩包文件包含了关于Java数据库连接(JDBC)以及PostgreSQL、Oracle和SQL Server 2000这三种数据库的相关内容。描述中提到,这份资料将详细介绍...

    Oracle至PostgreSQL数据库迁移方案.pptx

    "Oracle至PostgreSQL数据库迁移方案" Oracle至PostgreSQL数据库迁移方案是使用Ora2PG工具实现的,该工具是一个Perl语言编写的开源工具,用于将Oracle或MySQL数据库迁移到PostgreSQL数据库。下面是该方案的详细知识...

    支持多种数据源的nacos-1.4.2,包括mysql/postgresql/oracle/derby

    支持多种数据源的nacos,包括mysql/postgresql/oracle/derby 版本号为1.4.2 对应的各个组件版本 springcloud version: 2020.0.1 springboot version: 2.4.2 springcloudalibaba version: 2021.1 需根据自身情况修改...

    postgresql和oracle创建空间索引

    标题中的“postgresql和oracle创建空间索引”涉及的是在两种主流的关系型数据库管理系统(RDBMS)中,如何为地理空间数据创建索引的技术。在处理包含地理信息的数据时,如地图坐标、地理位置等,空间索引能显著提高...

    Sqlserver、Oracle、MySql、PostgreSql、SqlLite数据库差异

    - **Sqlserver**、**Oracle**、**MySql**、**PostgreSql** 和 **SqlLite** 都提供了丰富的内置函数支持,包括数学、日期时间、字符串处理等多方面功能。 #### 五、分页 分页是数据库中常见的需求之一,不同的...

    Oracle向PostgreSQL移植实例

    - 注意Oracle与PostgreSQL在建表脚本上的差异,例如字段类型、默认值和约束定义。 - PostgreSQL的字段名是区分大小写的,建议使用小写字母以保持兼容性。 - Oracle的sysdate在PostgreSQL中应替换为now()来获取...

    PostgreSQL PG&Oracle-备份技术完美攻略

    PostgreSQL PG&Oracle 备份技术完美攻略 PostgreSQL 和 Oracle 是两个最流行的关系数据库管理系统,它们都提供了强大的备份和恢复机制,以确保数据的安全和可靠性。在本篇文章中,我们将详细介绍 PostgreSQL 和 ...

    PostgreSQL MySQL Oracle数据库设计优化完美攻略

    无论我们选择哪种数据库系统——PostgreSQL、MySQL还是Oracle,设计阶段的优化措施都将对系统的性能和可靠性产生深远的影响。本文将深入探讨在数据库设计阶段,如何通过合理策略来优化性能,以确保设计出的数据库既...

    oracle迁移到PostgreSQL社区代码

    6. **权限和安全**:PostgreSQL的安全模型与Oracle不同,需要重新设定用户权限和访问控制,以确保数据安全。 7. **应用适配**:如果应用直接连接到数据库,可能需要修改应用程序代码以适应新的数据库接口。 8. **...

    oracle移植到postgreSQL

    2. **性能评估**:在迁移后,需要对PostgreSQL的性能进行评估,可能需要优化查询、调整索引或调整配置参数以达到与Oracle相当的性能。 3. **应用程序修改**:如果应用程序直接与数据库交互,可能需要对代码进行修改...

    关于PLC与SQLServer/MySQL/PostgreSQL/Oracle数据库之间通讯的案例与资料

    IGT-DSER智能网关模块,支持各种PLC、智能仪表、远程IO与数据库之间双向通讯,既可以读取设备的数据上报到SQL数据库,也可以从数据库查询数据后写入到设备;数据库软件支持MySQL、SQLSwever、PostgreSQL。 网关安装...

    dbForge.Studio.for(mysql,sql,Oracle,PostgreSQL)

    dbForge Studio 是一系列高效、全面的数据库开发和管理工具,专为MySQL、SQL Server、Oracle以及PostgreSQL数据库设计。这些工具旨在提升数据库专业人员的工作效率,提供一体化的环境来完成从设计、创建到优化和监控...

    Oracle至PostgreSQL案例分享.zip

    在这个过程中,需要注意数据类型的一致性,因为Oracle和PostgreSQL的数据类型可能存在差异,例如Oracle的NUMBER与PostgreSQL的NUMERIC,可能需要进行转换。 在迁移过程中,需要特别关注兼容性和功能匹配。例如,...

    PostgreSQLOracle风格的全局临时表

    标题中的“PostgreSQL Oracle风格的全局临时表”指的是在PostgreSQL数据库系统中实现类似Oracle数据库的全局临时表功能。在Oracle数据库中,全局临时表(Global Temporary Tables, GTT)是一种特殊的表类型,它们...

Global site tag (gtag.js) - Google Analytics