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’]) |
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 |
PostgreSQL与Oracle的区别
原文作者:PostgreSQL
原文地址: https://www.cnblogs.com/sekihin/archive/2009/01/14/1375329.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://www.cnblogs.com/sekihin/archive/2009/01/14/1375329.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。