Oracle遷移PostgreSQL經驗總結(SQL部分,未完待續)

序號 項目 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關鍵字而後提供一個類型轉換的表達式
相關文章
相關標籤/搜索