Oracle vs PostgreSQL,研發注意事項(7)- 型別轉換
本節以數值型相互轉換以及數值型和字元型的轉換為例大體介紹了Oracle和PostgreSQL型別轉換上的部分異同,可據此思路推廣到其他型別。
一、數值型別轉換
下面以數值型別為例子說明,包括運算結果的轉換和強制型別轉換.
運算結果
以除運算為例說明.
PostgreSQL的除運算
testdb=# select 1/4;
?column?
----------
0
(1 row)
Oracle的除運算
TEST-orcl@server4>select 1/4 from dual;
1/4
----------
.25
兩個整型值1和4參與除法運算,結果PostgreSQL為整型的0,Oracle為浮點型的0.25,兩者的行為不一致.
為何PostgreSQL執行整型運算返回的結果是整型?當然,這是PG的機制(整型/整型=整型)使然,在PG中,運算的結果型別可查詢pg_operator獲得:
testdb=# \x
Expanded display is on.
testdb=# select * from pg_operator where oprname = '/' and oprleft=21 and oprright = 21;
-[ RECORD 1 ]+--------
oprname | / -->運算子
oprnamespace | 11
oprowner | 10
oprkind | b
oprcanmerge | f
oprcanhash | f
oprleft | 21 -->int2(佔用2個位元組的整型,透過select * from pg_type where oid=21查詢可得)
oprright | 21 -->同上
oprresult | 21 -->整型/整型,結果也是整型
oprcom | 0
oprnegate | 0
oprcode | int2div
oprrest | -
oprjoin | -
在PostgreSQL中,要想獲得0.25的結果,需要進行轉換:
testdb=# select 1/4::float;
?column?
----------
0.25
(1 row)
二、強制型別轉換
以字元型->整型為例說明.
PostgreSQL
testdb=# drop table if exists t_cast ;
DROP TABLE
testdb=# create table t_cast (c_int int,c_s varchar(20));
CREATE TABLE
testdb=# insert into t_cast values(1,'1');
INSERT 0 1
testdb=# insert into t_cast values(2,'2');
INSERT 0 1
testdb=# select * from t_cast where c_int = 1;
c_int | c_s
-------+-----
1 | 1
(1 row)
testdb=# select * from t_cast where c_s = 1;
ERROR: operator does not exist: character varying = integer -->可變長字元型轉換為整型
LINE 1: select * from t_cast where c_s = 1;
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Oracle
TEST-orcl@server4>drop table t_cast;
Table dropped.
TEST-orcl@server4>create table t_cast (c_int int,c_s varchar2(20)) tablespace users;
Table created.
TEST-orcl@server4>insert into t_cast values(1,'1');
1 row created.
TEST-orcl@server4>insert into t_cast values(2,'2');
1 row created.
TEST-orcl@server4>select * from t_cast where c_int = 1;
C_INT C_S
---------- --------------------
1 1
TEST-orcl@server4>select * from t_cast where c_s = 1;
C_INT C_S
---------- --------------------
1 1
PG,整型不能轉換為字元型,而Oracle可以.
PG可以透過顯式型別轉換或者自定義型別轉換的機制實現字元型->整型的轉換:
-- 顯式轉換
testdb=# select * from t_cast where c_s = 1::varchar;
c_int | c_s
-------+-----
1 | 1
(1 row)
-- 自定義型別轉換
testdb=# create cast(varchar as integer) with inout as implicit;
CREATE CAST
testdb=# select * from t_cast where c_s = 1;
c_int | c_s
-------+-----
1 | 1
(1 row)
透過資料字典表pg_cast可查詢PG支援的型別轉換.
testdb=# select oid,a.* from pg_cast a where castsource=1043 and casttarget = 23;
oid | castsource | casttarget | castfunc | castcontext | castmethod
-------+------------+------------+----------+-------------+------------
16774 | 1043 | 23 | 0 | i | i --> 這是新加的記錄
三、參考資料
CREATE CAST
PostgreSQL 自定義自動型別轉換(CAST)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374838/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle vs PostgreSQL,研發注意事項(10)- PostgreSQL資料型別轉換規則#2OracleSQL資料型別
- Oracle vs PostgreSQL,研發注意事項(11)- PostgreSQL資料型別轉換規則#3OracleSQL資料型別
- Oracle vs PostgreSQL,研發注意事項(9)- PostgreSQL資料型別轉換規則#1OracleSQL資料型別
- Oracle vs PostgreSQL,研發注意事項(5)- 字元型別OracleSQL字元型別
- Oracle vs PostgreSQL,研發注意事項(6)- 事務處理OracleSQL
- Oracle vs PostgreSQL,研發注意事項(12) - NULL與索引OracleSQLNull索引
- Oracle vs PostgreSQL,研發注意事項(13) - UPDATE語句OracleSQL
- Oracle vs PostgreSQL,研發注意事項(1)-查詢鎖表OracleSQL
- Oracle vs PostgreSQL,研發注意事項(2)-DDL語句與事務OracleSQL
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- Oracle vs PostgreSQL,研發注意事項(3)- 事務回滾之UPDATE操作解析OracleSQL
- Oracle vs PostgreSQL,研發注意事項(4)- PageSize對資料儲存的影響OracleSQL
- 型別轉換注意點型別
- Oracle使用*的注意事項Oracle
- 換工作的注意事項
- 向下轉型的注意事項與instanceof的使用
- Oracle 資料匯出注意事項Oracle
- Oracle臨時表使用注意事項Oracle
- 編寫ORACLE效能報告的九大注意事項(轉載)Oracle
- 非分割槽錶轉換成分割槽表以及注意事項
- Oracle:記憶體設定注意事項Oracle記憶體
- [Android開發] 注意事項Android
- 低程式碼開發平臺選型注意事項
- vs.net 2003水晶報表部署注意事項
- 膝上型電腦改裝Win7系統注意事項Win7
- 型別轉換型別
- CENTOS 7 使用ORACLE VM VirtualBox 建立兩個虛擬網路卡注意事項CentOSOracle
- 小遊戲引擎選型注意事項遊戲引擎
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 【ASM】Oracle asm刪除磁碟組注意事項ASMOracle
- PostgreSQL 原始碼解讀(202)- 查詢#115(型別轉換)SQL原始碼型別
- 資料型別,型別轉換資料型別
- 淺談Go型別轉換之間的那些事Go型別
- 淺談 Go 型別轉換之間的那些事Go型別
- Oracle vs PostgreSQL DBA(21)- Oracle VPDOracleSQL
- js型別轉換JS型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別