PostgreSQL和Oracle的sql差異
1.rownum
(1)Oracle分頁查詢使用rownum,PostgreSQL使用limit offset
POSTGRESQL | |
---|---|
select * from (select rownum r,e.* from emp e where rownum <=5) t where r>0; | select * from emp limit 5 offset 0; |
(2)Oracle中rownum=1,PostgreSQL中使用limit 1
ORACLE | POSTGRESQL |
---|---|
select * from emp where rownum = 1; | select * from emp limit 1; |
(3)Oracle中序號列rownum,PostgreSQL使用窗口函數
ORACLE | POSTGRESQL |
---|---|
select rownum,t.* from emp t; | select row_number() over(), t.* from emp t; |
2.系統日期
ORACLE | POSTGRESQL |
---|---|
SYSDATE | current_timestamp, current_date |
3.delete語句
Oracle delete語句可以沒有from,pg必須要有from
ORACLE | POSTGRESQL |
---|---|
delete from emp where empno = xxx; delete emp where empno = xxx | delete from emp where empno = xxx |
4.類型自動轉換
Oracle支持類型自動轉換,例如數字自動換換為字符串等;PG中需要顯示轉換,或者添加CAST
5.子查詢別名
PostgreSQL在from關鍵字后的子查詢必須要有別名,Oralce可以沒有。
6. group by having
PG having語句必須在group by之后,oracle可以在group by之前
7.遞歸查詢
Oracle中使用start with … connect by…, PG中使用with recusive
ORACLE | POSTGRESQL |
---|---|
select * from larearrelation where rearedgens = 1 and rearflag = 1 and rearlevel = ‘01’ connect by prior agentcode = rearagentcode start with rearagentcode = ‘10032226’; | with recursive rs as ( select * from larearrelation where rearagentcode = ‘10032226’ union all select a. *from larearrelation a, rs where a.rearagentcode = rs.agentcode ) select ** from rs where rearedgens = 1 and rearflag = ‘1’ and rearlevel = ‘01’ |
8.update語句別名
postgresql中update語句時,set的字段不能有別名
ORACLE | POSTGRESQL |
---|---|
update emp t set t.name = ‘xxx’ where t.empno = 2 | update emp set name = ‘xxx’ where empno = 2 |
9. 日期相減
oracle日期相減自動轉換為數字,結果為相差的天數。 pg日期相減為interval類型,得到相差天數需要進行類型轉換
10.遞歸查詢中的level
oracle的遞歸查詢中level表示查詢深度(或者遞歸層次),在PG中沒有此含義的關鍵字,需要自行在with recursive實現
ORACLE | POSTGRESQL |
---|---|
select max(level) from larearrelation where rearedgens = 1 and rearflag = 1 and rearlevel = ‘01’ connect by prior agentcode = rearagentcode start with rearagentcode = ‘10032226’; |
with recursive rs as ( select larearrelation.*, 1 depth from larearrelation where rearagentcode = ‘10032226’ union all select a./**, rs.depth + 1 depth from larearrelation a, rs where a.rearagentcode = rs.agentcode ) select max(rs.depth) from rs where rearedgens = 1 and rearflag = ‘1’ and rearlevel = ‘01’ |
11.序列的調用
序列: https://www.cnblogs.com/mchina/archive/2013/04/10/3012493.html
ORACLE | POSTGRESQL |
---|---|
select seqname.nextval from dual; | select nextval(‘seqname’) |
12.外連接
Oralce外連接支持使用 (+), PostgreSQL需使用left jion或者right join標准sql語法
13.distinct去重復
oracle支持unique關鍵字去重復,pg中只能使用distinct
14.字符串分割
ORACLE | POSTGRESQL |
---|---|
listagg | string_agg |
15.集合相減
ORACLE | POSTGRESQL |
---|---|
Minus | except |
16.null與 ''
null和’’在oracle中是一致的,最終都會存儲為null,在PG中會進行區分
17.不等於
Oracle中 ! =,< >操作符中間允許有空格,PG中不可以
18.別名
PG中無效的別名,可以嘗試加as關鍵字,例如name
19.正則表達式
ORACLE | POSTGRESQL |
---|---|
SELECT REGEXP_SUBSTR(‘17,20,23’,’,+’,1,1,’i’) FROM DUAL; | select (regexp_matches(‘17,20,23’, ‘,+’))[1] |
20.字段大小寫
oracle字段名大寫,PG字段名小寫
21.NVL --- COALESCE
ORACLE | POSTGRESQL |
---|---|
SELECT NVL(SUM(VALUE1),0) S_VALUE1 FROM FIELD_SUM ; | SELECT COALESCE(SUM(VALUE1),0) AS S_VALUE1 FROM FIELD_SUM ; |
22.TO_NUMBER
ORACLE | POSTGRESQL |
---|---|
SELECT COL1 FROM A_TABLE ORDER BY TO_NUMBER(COL1); | SELECT COL1 FROM A_TABLE ORDER BY TO_NUMBER(COL1, 999999) [注:'999999' ---- 6位數為COL1字段的長度] |
23.DECODE --- CASE WHEN
ORACLE | POSTGRESQL |
---|---|
SELECT DECODE(ENDFLAG, '1', 'A', 'B') ENDFLAG FROM TEST; | SELECT (CASE ENDFLAG WHEN '1' THEN 'A' ELSE 'B' END) AS ENDFLAG FROM TEST; |
24.ADD_MONTHS
ORACLE | POSTGRESQL |
---|---|
add_months(date, int) | --創建函數來解決 RETURNS date AS 'SELECT ($1 + ( $2::text || ''months'')::interval)::date;' LANGUAGE 'sql' |
25.LAST_DAY
ORACLE | POSTGRESQL |
---|---|
LAST_DAY(DATE) | --創建函數來解決 RETURNS DATE AS 'SELECT date(substr(text($1 + interval(''1 month'')),1,7)||''-01'')-1' LANGUAGE 'sql'; |
26.LAST_DAY
ORACLE | POSTGRESQL |
---|---|
LAST_DAY(DATE) | --創建函數來解決 RETURNS DATE AS 'SELECT date(substr(text($1 + interval(''1 month'')),1,7)||''-01'')-1' LANGUAGE 'sql'; |
未完待續。。。。。。