CREATE CAST -
定義一個使用者定義的轉換
CREATE CAST ( sourcetype AS targettype)
WITH FUNCTION funcname (argtype)
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST ( sourcetype AS targettype)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST
定義一個新的轉換。
一個轉換說明如何在兩個型別之間進行轉換。比如:
SELECT CAST(42 AS text);
透過呼叫前面宣告的一個函式,把整數常量
42 轉換成型別 text,
在這個例子裡是
text(int4)。(如果沒有預先定義好合適的轉換,那麼這個轉換失敗。)
兩種型別可以是二進位制相容的,
意思是它們之間可以"自由轉換"而不用呼叫任何函式。
這就需要那個對應的數值使用同樣的內部表現形式。
比如,型別 text 和 varchar
是二進位制相容的。
預設時,只有在明確要求轉換的情況下才呼叫一個轉換,
也就是一個明確的 CAST(x AS
typename), x::typename,或者 typename(x)
構造。
如果轉換標記為 AS
ASSIGNMENT,那麼在賦一個數值給目標資料型別的欄位的時候,
可以隱含呼叫它。比如,假設
foo.f1 是一個型別為 text
的欄位,那麼
INSERT INTO foo (f1) VALUES (42);
如果從型別 integer 到型別 text
的轉換標記為 AS ASSIGNMENT,
上面的這句就被允許,否則就不允許。(我們通常用術語賦值轉換來描述這種轉換。)
如果轉換標記為 AS
IMPLICIT,那麼它就可以在任何環境裡呼叫,
不管是賦值還是在表示式的內部。比如,因為
|| 接受 text 運算元,
SELECT 'The time is ' || now();
將只有在型別 timestamp 到 text
的轉換標記為 AS IMPLICIT
的時候才允許。否則我們就必須明確書寫轉換,
比如
SELECT 'The time is ' || CAST(now() AS text);
(我們通常使用術語隱含轉換來描述這種型別的轉換。)
在標記轉換為隱含的這個問題上保守一些是明智的。
過於豐富的隱含轉換路徑會導致
PostgreSQL
選擇讓人奇怪的命令的解析,
或者是完全不能解析命令,因為存在多個可能的解析。
一條好的拇指定律是,只有在同一個通用型別表裡面的那些可以保留轉換資訊的型別之間才標記為可隱含呼叫轉換。
比如,從 int2 到 int4
可以合理地標記為隱含轉換,但是從
float8 到 int4
可能應該是標記為賦值轉換。跨型別表的轉換,比如
text 到
int4,最好是隻能明確地轉換。
要想建立一個轉換,你必須擁有源或者目的資料型別。要建立一個二進位制相容的轉換,
你必須是超級使用者。(做這個限制是因為一種有問題的二進位制相容轉換可以很容易摧毀伺服器。)
-
sourcetype
- 轉換的源資料型別。
-
targettype
- 轉換的目標資料型別。
-
funcname(argtype)
- 用於執行轉換的函式。這個函式名可以是用模式名修飾的。
如果它沒有用模式名修飾,那麼該函式將從路徑中找出來。
引數型別必須和源資料型別相同,結果資料型別必須匹配轉換的目標型別。
- WITHOUT FUNCTION
- 表示源資料型別和目標資料型別是二進位制相容的,
所以不需要什麼函式來執行轉換。
- AS ASSIGNMENT
- 表示轉換可以在賦值環境裡隱含呼叫。
- AS IMPLICIT
- 表示這個轉換可以在任何環境裡隱含呼叫。
用 DROP CAST
刪除使用者定義的轉換。
請注意,如果你想能雙向轉換型別,那麼你需要明確地定義兩個方向的轉換。
在 PostgreSQL 7.3
之前,如果一個函式的名字和一個數據型別相同,
並且返回該種資料型別,而且還接受另外一種型別的引數自動就是一個轉換函式。
這個傳統隨著模式的引入以及為了能在系統表種表示二進位制相容的轉換就被廢棄了。
(內建的轉換函式仍然遵循這個命名規則,但是它們現在必須在系統表
pg_cast 裡顯示為轉換。)
要使用函式 int4(text)
建立一個從型別 text
到型別 int4的轉換:
CREATE CAST (text AS int4) WITH FUNCTION int4(text);
(這個轉換在系統中已經預先定義了。)
CREATE CAST 命令遵循
SQL99,只不過 SQL99
沒有提供二進位制相容型別。AS
IMPLICIT 也是 PostgreSQL
的擴充套件。
CREATE FUNCTION [
create_function(7)], CREATE TYPE [
create_type(7)], DROP CAST [
drop_cast(7)]
Postgresql 中文網站 何偉平
<[email protected]>.SH 跋
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh