序號 | 項目 | Oracle | PostgreSQL |
1 | 當前時間 | SYSDATE | 可所有使用current_timestamp替換 |
2 | 序列 | SEQNAME.NEXTVAL | NEXTVAL('SEQNAME') |
3 | 固定值列 | SELECT '1' AS COL1 | SELECT CAST('1' AS TEXT) AS COL1 |
4 | NVL | NVL函數 | NVL能夠用COALESCE函數替換 |
5 | 類型自動轉換 | Oracle某些狀況下支持類型自動轉換 | 會出現類型不匹配等錯誤,須要在Java或者sql中進行類型轉換,使類型匹配 |
6 | INSTR函數 | instr('str1','str2') | strpos('str1','str2') |
7 | 外鏈接 | Oracle可簡寫爲(+) | 用LEFT JOIN等語句替換 |
8 | 層次查詢 | START WITH語句 CONNECT BY語句 |
用WITH RECURSIVE語句 |
9 | 數據庫對象大小寫 | 不區分大小寫 | 建立數據庫對象時要小寫,這樣纔不區分SQL的大小寫 |
10 | 同義詞 | Oracle支持同義詞 | 用視圖代替 |
11 | DUAL | SELECT 1+1 FROM DUAL | SELECT 1+1 或者 CREATE VIEW dual AS SELECT current_timestamp |
12 | ROWNUM | ROWNUM關鍵字 | 兩種狀況: 1.限制結果集數量,用於翻頁等: SELECT * FROM T LIMIT 5 OFFSET 0 2.生成行號: ROW_NUMBER() OVER() |
13 | DECODE等判斷函數 | DECODE() | 用標準的CASE WHEN THEN ELSE END語句替換 |
14 | TO_CHAR | TO_CHAR(COL,FMT),格式化字符串能夠爲空 | TO_CHAR(COL1,'FM999999'),9的個數爲字段長度,詳細定義見: http://www.postgresql.org/docs/9.4/static/functions-formatting.html |
15 | TO_NUMBER | TO_NUMBER(COL,FMT),格式化字符串能夠爲空 | TO_NUMBER(COL1,'999999'),9的個數爲字段長度,詳細定義見: http://www.postgresql.org/docs/9.4/static/functions-formatting.html |
16 | NULL和'' | ORACLE認爲''等同於NULL | NULL和''不一樣 |
17 | NULL和'' | LENGTH('')爲NULL | LENGTH('')爲0 |
18 | NULL和'' | TO_DATE('','YYYYMMDD')爲空 | TO_DATE('','YYYYMMDD')爲0001-01-01 BC |
19 | NULL和'' | TO_NUMBER('',1)爲NULL | TO_NUMBER('',1),報錯 |
20 | NULL和'' | INSERT INTO TEST(VALUE4)VALUES('') [Result]VALUE4=NULL (注:VALUE3字段爲數值類型) |
INSERT INTO TEST(VALUE4)VALUES('') VALUE4=NULL |
21 | NULL和'' | INSERT INTO TEST(VALUE4)VALUES('') [Result]VALUE4=NULL (注:VALUE3字段爲字符類型) |
INSERT INTO TEST(VALUE4)VALUES('') VALUE4='' |
22 | NULL和'' | INSERT INTO TEST(VALUE4)VALUES(TO_DATE('','YYYYMMDD')) [Result]VALUE4=NULL (注:VALUE3字段爲時間類型) |
INSERT INTO TEST(VALUE6)VALUES(TO_DATE('','YYYYMMDD')) [Result]VALUE6=0001-01-01 BC |
23 | ADD_MONTHS | ADD_MONTHS(DATE,INT) | CREATE FUNCTION add_months(date, int) RETURNS date AS 'SELECT ($1 +($2::text||'' month'')::interval)::date' LANGUAGE 'sql' 或SQL: SELECT ($1 +($2::text||' month')::interval) |
24 | LAST_DAY | LAST_DAY(DATE) | 建立函數來解決 CREATE OR REPLACE FUNCTION last_day(date) RETURNS date AS $$ SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::date; $$ LANGUAGE 'sql'; 或SQL: SELECT (date_trunc('MONTH', $1) + interval '1 month - 1 day')::date; |
25 | MONTHS_BETWEEN | MONTHS_BETWEEN(DATE,DATE) | 建立函數來解決 CREATE FUNCTION MONTH_BETWEEN(d1 timestamp,d2 timestamp) RETURNS NUMERIC AS 'SELECT (extract(year from age(d1,d2))*12 + extract(month from age(d1,d2)))::integer' LANGUAGE 'sql'; |
26 | BITAND | BITAND(A,B) | A & B |
27 | MINUS | MINUS語句 | 以EXCEPT語句來替代 |
28 | BIN_ | SELECT BIN_TO_NUM(1,0,1,0) AS VALUE1 FROM DUAL | SELECT CAST(B'1010' AS INTEGER) AS VALUE1 |
29 | UPDATE語句列列表 | UPDATE accounts SET (contact_last_name, contact_first_name) = (SELECT last_name, first_name FROM salesmen WHERE salesmen.id = accounts.sales_id); |
不支持該語法,須要拆分爲多個單獨的列 |
30 | SUBSTR函數 | 若是從第一個開始取子串,能夠從0開始,也能夠從1開始,若是不是第一個開始,則從1開始計數,能夠爲負值,從字符串結尾計數,用於取最後幾位。 | 從1開始計數。若是要取最後幾位,能夠用RIGHT函數解決。 |
31 | 子查詢別名 | 若是FROM後只有一個子查詢,該子查詢能夠沒有別名 | 必須有別名 |
32 | 列(別)名爲關鍵字 | Oracle中好比name,type這樣的關鍵字能夠直接做爲列的別名,好比:select xx name from t | 須要加as,好比select xx as name from t |
33 | 當前登陸用戶 | SELECT USER FROM DUAL | select current_user |
34 | ALL_COL_COMMENTS | 經過SELECT * FROM ALL_COL_COMMENTS能夠得到列註釋信息 | select s.column_name as COLUMN_NAME,coalesce(col_description(c.oid,ordinal_position) ,s.column_name) as COMMENTS from information_schema.columns s,pg_class c where s.table_name = 'ac01_si' and s.table_name = c.relname and s.table_schema = current_schema() PG須要經過col_description得到列註釋信息 |
35 | 修改表字段類型 | 1.若是字段無數據,可直接修改 2.若是有數據且新類型和原類型兼容,也能夠直接修改 3.若是不兼容,可經過對原字段更名,而後增長新字段,再經過UPDATE語句對數據進行處理 |
1.若是新類型和原類型兼容,可直接修改 2.若是不兼容,須要使用USING關鍵字而後提供一個類型轉換的表達式 |