| 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(DAYFROM (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 ASDAYS
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 |