Provided by:
manpages-zh_1.5-1_all 
NAME
CREATE CAST - 定義一茖洏峈怍w義的轉換
SYNOPSIS
CREATE CAST (sourcetype AS targettype)
WITH FUNCTION funcname (argtype)
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (sourcetype AS targettype)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
DESCRIPTIONyz
CREATE CAST 定義一虓s的轉換。 一蚋鉥姣〝如何在兩-
蚚型之間進行轉換。比如:
SELECT CAST(42 AS text);
通過調用前掄n明的一茖蝻A把整數常量 42 轉換成類型 text, 在這茖狺l裏是
text(int4)。(如果沒有預先定義好合適的轉換,那麼這蚋鉥咱2恁C)
兩種類型可以是二進制相容的, 意思是它-
怳孜‘i以"自由轉換"而不用調用任何函數。 這就需n那蚢奰釭獐-
洏峖P樣的內部表現形式。 比如,類型 text 和 varchar 是二進制相容的。
預設時,只有在明確n求轉換的情況下才調用一蚋鉥哄A 也就是一茤確的 CAST(x
AS typename), x::typename,或者 typename(x) 構造。
如果轉換標記為 AS ASSIGNMENT,那麼在賦一蚍給目標數據類型的字段的時唌A
可以隱含調用它。比如,假設 foo.f1 是一蚚型為 text 的字段,那麼
INSERT INTO foo (f1) VALUES (42);
如果從類型 integer 到類型 text 的轉換標記為 AS ASSIGNMENT, 上-
悸熙o句就被允許,否則就不允許。(我抭q常用術語賦鉥咧荋yz這種轉換。)
如果轉換標記為 AS IMPLICIT,那麼它就可以在任何環境裏調用, 不管是賦-
椄O在表達式的內部。比如,因為 || 接受 text 操作數,
SELECT 'The time is ' || now();
將只有在類型 timestamp 到 text 的轉換標記為 AS IMPLICIT 的時-
啎~允許。否則我抴N必須明確書寫轉換, 比如
SELECT 'The time is ' || CAST(now() AS text);
(我抭q常使用術語隱含轉換來描z這種類型的轉換。)
在標記轉換為隱含的這荌暋D上保守一些是明智的。
過於豐富的隱含轉換路徑會導P PostgreSQL 選擇讓人奇怪的命令的解析,
或者是完全不能解析命令,因為存在多茈i能的解析。
一條好的拇指定律是,只有在同一茬q用類型表裏-
悸漕漕i以保留轉換信息的類型之間才標記為可隱含調用轉換。 比如,從 int2
到 int4 可以合理地標記為隱含轉換,但是從 float8 到 int4
可能應該是標記為賦鉥哄C跨類型表的轉換,比如 text 到
int4,最好是只能明確地轉換。
n想創建一蚋鉥哄A你必須擁有源或者目的數據類型。n創建一-
茪G進制相容的轉換, 你必須是超級使用者。(做這-
制是因為一種有問題的二進制相容轉換可以很容易摧毀伺服器。)
PARAMETERS數
sourcetype
轉換的源數據類型。
targettype
轉換的目標數據類型。
funcname(argtype)
用於執行轉換的函數。這茖蝻W可以是用模式名袡◥滿C
如果它沒有用模式名袡╮A那麼該函數將從路徑中找出來。
參數類型必須和源數據類型相同,結果數據類型必須匹配轉換的目標類型。
WITHOUT FUNCTION
表示源數據類型和目標數據類型是二進制相容的, 所以不需-
n什麼函數來執行轉換。
AS ASSIGNMENT
表示轉換可以在賦藿窋媮籈t調用。
AS IMPLICIT
表示這蚋鉥咱i以在任何環境裏隱含調用。
NOTES`N
用 DROP CAST 刪除使用者定義的轉換。
請注意,如果你想能雙向轉換類型,那麼你需n明確地定義兩茪閬V的轉換。
在 PostgreSQL 7.3 之前,如果一茖蝻漲W字和一蚍矞型相同,
並且返回該種數據類型,而且還接受另外一種類型的參數自動就是一蚋鉥咧蝻C
這-
荈怹H著模式的引入以及為了能在系統表種表示二進制相容的轉換就被廢棄了。
(內置的轉換函數仍然遵循這茤R名規則,但是它戽{在必須在系統表 pg_cast
裏顯示為轉換。)
EXAMPLESl
n使用函數 int4(text) 創建一荓q類型 text 到類型 int4的轉換:
CREATE CAST (text AS int4) WITH FUNCTION int4(text);
(這蚋鉥咻b系統中已經預先定義了。)
COMPATIBILITYe性
CREATE CAST 命令遵循 SQL99,只不過 SQL99 沒有提供二進制相容類型。AS
IMPLICIT 也是 PostgreSQL 的擴展。
SEE ALSO見
CREATE FUNCTION [create_function(7)], CREATE TYPE [create_type(7)],
DROP CAST [drop_cast(7)]
者
Postgresql <laser@pgsqldb.org>