Man page - create_cast(7)

Manual

CREATE CAST

NAME
SYNOPSIS
DESCRIPTION 描 述
PARAMETERS 引 數
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 相 容 性
SEE ALSO 參 見
譯 者

NAME

CREATE CAST - 定 義 一 個 使 用 者 定 義 的 轉 換

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 ]

DESCRIPTION 描 述

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, 最 好 是 隻 能 明 確 地 轉 換 。

要 想 建 立 一 個 轉 換 , 你 必 須 擁 有 源 或 者 目 的 資 料 型 別 。 要 建 立 一 個 二 進 位 制 相 容 的 轉 換 , 你 必 須 是 超 級 使 用 者 。 ( 做 這 個 限 制 是 因 為 一 種 有 問 題 的 二 進 位 制 相 容 轉 換 可 以 很 容 易 摧 毀 伺 服 器 。 )

PARAMETERS 引 數

sourcetype

轉 換 的 源 資 料 型 別 。

targettype

轉 換 的 目 標 資 料 型 別 。

funcname ( argtype )

用 於 執 行 轉 換 的 函 式 。 這 個 函 式 名 可 以 是 用 模 式 名 修 飾 的 。 如 果 它 沒 有 用 模 式 名 修 飾 , 那 麼 該 函 式 將 從 路 徑 中 找 出 來 。 引 數 型 別 必 須 和 源 資 料 型 別 相 同 , 結 果 資 料 型 別 必 須 匹 配 轉 換 的 目 標 型 別 。

WITHOUT FUNCTION

表 示 源 資 料 型 別 和 目 標 資 料 型 別 是 二 進 位 制 相 容 的 , 所 以 不 需 要 什 麼 函 式 來 執 行 轉 換 。

AS ASSIGNMENT

表 示 轉 換 可 以 在 賦 值 環 境 裡 隱 含 呼 叫 。

AS IMPLICIT

表 示 這 個 轉 換 可 以 在 任 何 環 境 裡 隱 含 呼 叫 。

NOTES 注 意

用 DROP CAST 刪 除 使 用 者 定 義 的 轉 換 。

請 注 意 , 如 果 你 想 能 雙 向 轉 換 型 別 , 那 麼 你 需 要 明 確 地 定 義 兩 個 方 向 的 轉 換 。

在 PostgreSQL 7.3 之 前 , 如 果 一 個 函 式 的 名 字 和 一 個 數 據 型 別 相 同 , 並 且 返 回 該 種 資 料 型 別 , 而 且 還 接 受 另 外 一 種 型 別 的 引 數 自 動 就 是 一 個 轉 換 函 式 。 這 個 傳 統 隨 著 模 式 的 引 入 以 及 為 了 能 在 系 統 表 種 表 示 二 進 位 制 相 容 的 轉 換 就 被 廢 棄 了 。 ( 內 建 的 轉 換 函 式 仍 然 遵 循 這 個 命 名 規 則 , 但 是 它 們 現 在 必 須 在 系 統 表 pg_cast 裡 顯 示 為 轉 換 。 )

EXAMPLES 例 子

要 使 用 函 式 int4(text) 建 立 一 個 從 型 別 text 到 型 別 int4的 轉 換 :

CREATE CAST (text AS int4) WITH FUNCTION int4(text);

( 這 個 轉 換 在 系 統 中 已 經 預 先 定 義 了 。 )

COMPATIBILITY 相 容 性

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>.SH 跋
本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh