日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pg与oracle区别,PostgresQL 学习记录之与oracle区别(一)

發(fā)布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pg与oracle区别,PostgresQL 学习记录之与oracle区别(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

與oracle的區(qū)別

1、數據類型區(qū)別

Oracle

PostgresQL

注釋

VARCHAR2

VARCHAR(character

varying)

Long、

CLOB

TEXT

DATE

DATE/TIME/TIMESTAMP

DATE僅包含日期、TIME僅包含時間、TIMESTAMP均包含,通常使用DATE

NUMBER

SMALLINT/INTEGER/BIGINT/NUMERIC/REAL/DOUBLE

PRECISION

通常可用NUMERIC

BLOB

BYTEA

sysdate

now()、O_TIMESTAMP(CURRENT_TIMESTAMP,'YYYY-MM-DD

HH24:MI:SS')、CURRENT_TIMESTAMP

取系統(tǒng)當前時間

--PostgresQL中字段名稱區(qū)分大小寫,為保證兼容性,強烈建議腳本中的字符均用小寫,這樣在SQL語句中將忽略大小寫--PostgresQL中字段類型的括號中只能出現數字

2、語句與方法的區(qū)別

Function

Returns

Description

Example

to_char(timestamp,

text)

text

convert time stamp to

string

to_char(timestamp

'now','HH12:MI:SS')

to_char(interval,

text)

text

convert interval to

string

to_char(interval '15h

2m 12s','HH24:MI:SS')

to_char(int,

text)

text

convert integer to

string

to_char(125,

'999')

to_char(double

precision, text)

text

convert real/double

precision to string

to_char(125.8,

'999D9')

to_char(numeric,

text)

text

convert numeric to

string

to_char(numeric

'-125.8', '999D99S')

to_date(text,

text)

date

convert string to

date

to_date('05 Dec 2000',

'DD Mon YYYY')

to_timestamp(text,

text)

timestamp

convert string to time

stamp

to_timestamp('05 Dec

2000', 'DD Mon YYYY')

to_number(text,

text)

numeric

convert string to

numeric

to_number('12,454.8-',

'99G999D9S')

(1)注意增加約束時的寫法,和ORACLE略有不同

Oracle:

ALTER TABLE SCHEMA.PREFIX_INFO ADD (

CONSTRAINT

PK_PREFIX_INFO PRIMARY KEY (INFO_ID));

PostgresQL:

alter table schema.prefix_info add

constraint prefix_info_pkey primary key(info_id);

(2)系統(tǒng)默認的最大值與ORACLE不同

Oracle:

CREATE SEQUENCE

PREFIX_INFO_SEQUENCE

INCREMENT BY 1

START WITH 582

MINVALUE 1

MAXVALUE 9999999999999999999999999999

NOCYCLE

CACHE 20

NOORDER;

PostgresQL:

CREATE SEQUENCE

schema.prefix_info_sequence

increment 1

minvalue 1

maxvalue

9223372036854775807

start 582

cache 20;

(3)PostgresQL中的

||用法與其他數據庫不同:select a||b from

table1;當a或b其中一個為null時,該查詢返回null,

(4)PostgresQL中沒有concat函數,且由于||用法的問題,無法使用||替換,解決方法為在public

schema中創(chuàng)建函數concat

create or replace function

concat(text, text)

returns text as

$body$select coalesce($1,'') ||

coalesce($2,'')$body$

language 'sql' volatile;

alter function concat(text,

text) owner to postgres;

--無需特殊授權即可在其他schema中使用

(4)PostgresQL中沒有dual虛擬表,為保證程序兼容性,可創(chuàng)建偽視圖(view)替代:

CREATE OR REPLACE VIEW dual AS

SELECT NULL::"unknown"

WHERE 1 = 1;

ALTER TABLE dual

OWNER TO postgres;

GRANT ALL ON TABLE dual TO postgres;

GRANT SELECT ON

TABLE dual TO public;

必須授權public以select權限

(5)關聯(lián)查詢用法區(qū)別

ORACLE:

簡單外連接:

SELECT

COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM

SCHEMA.PREFIX_TABLE1

A,SCHEMA.PREFIX_TABLE2 B

WHERE 1 = 1

AND A.COL2 = B.COL2(+)

AND A.COL3

> 0

AND A.COL4 = '1'

超級變態(tài)外連接:

SELECT

COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM

SCHEMA.PREFIX_TABLE1

A,SCHEMA.PREFIX_TABLE2 B,SCHEMA.PREFIX_TABLE3 C,SCHEMA.PREFIX_TABLE4 D

WHERE

1 = 1

AND A.COL2 = B.COL2

AND A.COL3 = C.COL3(+)

AND A.COL4 =

D.COL4(+)

AND A.COL5 > 0

AND A.COL6 = '1'

POSTGRESQL:

簡單外連接:

select

count(distinct(a.col1)) as rcount from

schema.prefix_table1 a left outer

join schema.prefix_table2 b on (a.col2 = b.col2)

where 1 = 1

and a.col3

> 0

and a.col4 = '1'

超級變態(tài)外連接:

select

count(distinct(a.col1)) as rcount from

schema.prefix_table1 a inner join

schema.prefix_table2 b on (a.col2 = b.col2)

left outer join

schema.prefix_table3 c on (a.col3 = c.col3)

left outer join

schema.prefix_table4 d on (a.col4 = d.col4)

where 1 = 1

and a.col5 >

0

and a.col6 = '1'

(6)PostgresQL中子查詢較為規(guī)范,子查詢結果集必須擁有alias

ORACLE:

SELECT * FROM (

SELECT

* FROM (

SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1

) WHERE X=1 ORDER

BY COL2

) WHERE Y=2 ORDER BY COL3

POSTGRESQL:

SELECT * FROM (

SELECT * FROM

(

SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1 ALIAS1

) WHERE X=1 ORDER

BY COL2 ALIAS2

) WHERE Y=2 ORDER BY COL3

(7)

PostgresQL中沒有rownum,無法使用where rownum < =

X的方法進行分頁,取而代之的是limit X,offset

Y方法,而ORACLE中不允許使用LIMIT

X的方法

ORACLE:

SELECT * FROM ( SELECT * FROM (SELECT

* FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) where ROWNUM <= 50

ORDER BY COL3 ASC,COL4 DESC)

WHERE ROWNUM <= 20 ORDER BY COL5 DESC,COL6

ASC;

POSTGRES:

select * from ( select * from (SELECT

* FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) selb order by col3

asc,col4 desc limit 50 ) sela

order by col5 desc,col6 asc limit

20;

--注意!!limit必須用于order by之后

--例:取1到50條數據

select * from

VOIP_FEE_RATE temp offset 0 limit 50

(8)序列使用的區(qū)別

ORACLE:SELECT SCHEMA.PREFIX_TABLE1_SEQUENCE.NEXTVAL AS nCode

FROM DUAL

POSTGRES:SELECT

NEXTVAL('SCHEMA.PREFIX_TABLE1_SEQUENCE') AS nCode FROM DUAL

--注意,此方法前提是dual視圖已建立,如沒有,可省略FROM

DUAL

總結

以上是生活随笔為你收集整理的pg与oracle区别,PostgresQL 学习记录之与oracle区别(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。