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

[经验分享] (转发)PostgreSQL 与 Oracle 相异点

[复制链接]

尚未签到

发表于 2016-7-28 09:48:50 | 显示全部楼层 |阅读模式
  前段时间做了一个数据库移植的项目,对Oracle SQL 转化为PostgreSQL有了一点了解。现将项目中遇到的一些相异点,一一分享,共同提高,共同进步。
ORACLE 与 PostgreSQL相异点
NO问题点OraclePostgreSQL
1DUALSELECT 1+1 FROM DUALSELECT  1+1
或者
CREATE VIEWdual AS
      SELECT 'X'::VARCHAR(1) AS DUMMY
再SELECT 1+1 FROM DUAL
2NEXTVALSELECTA_TABLE_SEQUENCE.NEXTVAL
FROM   DUAL
SELECTNEXTVAL('A_TABLE_SEQUENCE')
FROM   DUAL
3ROWNUM①SELECT*
FROM  AGE_TYPE
WHERE ROWNUM<=5
①SELECT *
FROM AGE_TYPE
LIMIT 5OFFSET 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 5OFFSET 0
4(+)①SELECT*
FROM A_TABLE A , B_TABLE B
WHERE A.ID(+)=B.ID
①SELECT *
FROM A_TABLE A
RIGHTOUTER 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
RIGHTOUTER JOIN B_TABLE B
ON A.ID=B.ID AND A.COL1='COL1_VALUE'
③SELECT *
FROMA_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)
LEFTOUTER 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 ORA.COL1 IS NULL) AND
 (A.COL2='A_VALUE2' OR A.COL2 IS NULL)
5ASSELECTA.COL1  A_COL1,
           A.COL2  A_COL2
FROM A_TABLE A
SELECT A.COL1 AS A_COL1,
           A.COL2AS A_COL2
FROM A_TABLE A
6NVLSELECT 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 
7TO_
NUMBER
SELECT COL1
FROM A_TABLE
ORDER BY TO_NUMBER(COL1)
SELECTCOL1
FROM A_TABLE
ORDER BY TO_NUMBER(COL1,999999)
[注:'999999'---- 6位数COL1字段的度]
8DECODESELECT 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')
或者
UPDATEA_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
SELECTTO_DATE(CURRENT_DATE,'YYYY/MM/DD') AS DAY
FROM DUAL
10||SELECTNULL||'-'||NULL AS VALUES1
FROM DUAL
SELECT COALESCE(NULL,'')||'-'||COALESCE(NULL,'') AS VALUES1
FROM DUAL
SELECT NULL||'-' ||NULL AS VALUES1
FROM DUAL
11aggregateSELECT 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
    WHEREYEARCODE BETWEEN '200305' AND '200505'
    GROUPBY 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 FROMDUAL
[Result]不能
④INSERT INTO TEST(VALUE4)VALUES('')
[Result]VALUE4=NULL (注:VALUE3字段型)
④INSERT INTO TEST(VALUE4)VALUES('')
[Result]VALUE4=0
 (注:VALUE4字段型)
⑤INSERT INTOTEST(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-01BC
 (注:VALUE7字段为时间类型)
13CEILSELECT 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
14NULLIF无NULLIF函数SELECT NULLIF(VALUE1,VALUE2) AS COL1 FROM DUAL
[注]当VALUE1=VALUE2时,COL1=NULL
15CONCATCONCAT(CHAR,CHAR)创建函数来解决
CREATE FUNCTION CONCAT(CHAR,CHAR)
RETURNS CHAR AS
        'SELECT $1 || $2' LANGUAGE 'sql';
16ADD_
MONTHS
add_months(date, int)建函数来解决
CREATEFUNCTION add_months(date, int)
RETURNS date AS
'SELECT ($1 + ( $2::text || ''months'')::interval)::date;'
LANGUAGE 'sql'
17LAST
_DAY
LAST_DAY(DATE)建函数来解决
CREATE FUNCTION LAST_DAY(DATE)
RETURNSDATE AS
        'SELECT date(substr(text($1 +
                interval(''1 month'')),1,7)||''-01'')-1'
        LANGUAGE 'sql';
18MONTHS
_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';
19GRE~
ATEST
GREATEST(LEAST)建函数来解决
CREATEOR REPLACE FUNCTION
   GREATEST(TEXT[]) RETURNS TEXT AS '
DECLARE
   ARRY ALIAS FOR $1;
   GREATEST TEXT;
BEGIN
   GREATEST := ARRY[1];
   FOR IIN 1 .. ARRAY_UPPER(ARRY,1) LOOP
      IF ARRY[I] > GREATEST THEN
        GREATEST := ARRY[I];
      END IF;
   ENDLOOP;
   RETURN GREATEST;
END;
' LANGUAGE 'PLPGSQL';

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

运维网声明 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.yunweiku.com/thread-250519-1-1.html 上篇帖子: sql优化---oracle hint样例 下篇帖子: oracle 高级SQL查询笔记12-01
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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