Man page - create_aggregate(7)
Manual
CREATE AGGREGATE
NAMESYNOPSIS
DESCRIPTION 描 述
PARAMETERS 引 數
EXAMPLES 例 子
COMPATIBILITY 相 容 性
SEE ALSO 參 見
譯 者
跋
NAME
CREATE AGGREGATE - 定 義 一 個 新 的 聚 集 函 式
SYNOPSIS
CREATE AGGREGATE
name
(
BASETYPE =
input_data_type
,
SFUNC =
sfunc
,
STYPE =
state_data_type
[ , FINALFUNC =
ffunc
]
[ , INITCOND =
initial_condition
]
)
DESCRIPTION 描 述
CREATE AGGREGATE 定 義 一 個 新 的 聚 集 函 式 。 一 些 用 於 基 本 型 別 的 聚 集 函 式 如 min(integer) 和 avg(double precision) 等 已 經 包 含 在 基 礎 軟 體 包 裡 了 。 如 果 你 需 要 定 義 一 個 新 型 別 或 需 要 一 個 還 沒 有 提 供 的 聚 集 函 式 , 這 時 便 可 用 CREATE AGGREGATE 來 提 供 我 們 所 需 要 的 特 性 。
如 果 給 出 了 一 個 模 式 的 名 字 ( 比 如 , CREATE AGGREGATE myschema.myagg ...) , 那 麼 該 聚 集 函 式 是 在 指 定 模 式 中 建 立 的 。 否 則 它 是 在 當 前 模 式 中 建 立 的 。
一 個 聚 集 函 式 是 用 它 的 名 字 和 輸 入 資 料 型 別 來 標 識 的 。 同 一 模 式 中 如 果 兩 個 聚 集 處 理 的 輸 入 資 料 不 同 , 它 們 可 以 有 相 同 的 名 字 。 一 個 聚 集 函 式 的 輸 入 資 料 型 別 必 須 和 所 有 同 一 模 式 中 的 普 通 函 式 的 名 字 和 輸 入 型 別 不 同 。
一 個 聚 集 函 式 是 用 一 個 或 兩 個 普 通 函 式 做 成 的 : 一 個 狀 態 轉 換 函 式 sfunc, 和 一 個 可 選 的 終 計 算 函 式 ffunc. 它 們 是 這 樣 使 用 的 :
sfunc
(
internal-state, next-data-item ) ---> next-internal-state
ffunc
( internal-state ) ---> aggregate-value
PostgreSQL 建 立 一 個 型 別 為 stype的 臨 時 變 數 。 它 儲 存 這 個 聚 集 的 當 前 內 部 狀 態 。 對 於 每 個 輸 入 資 料 條 目 , 都 呼 叫 狀 態 轉 換 函 式 計 算 內 部 狀 態 值 的 新 數 值 。 在 處 理 完 所 有 資 料 後 , 呼 叫 一 次 最 終 處 理 函 式 以 計 算 聚 集 的 返 回 值 。 如 果 沒 有 最 終 處 理 函 式 , 那 麼 將 最 後 的 狀 態 值 當 做 返 回 值 。
一 個 聚 集 函 式 還 可 能 提 供 一 個 初 始 條 件 , 也 就 是 說 , 所 用 的 該 內 部 狀 態 值 的 初 始 值 。 這 個 值 是 作 為 一 個 型 別 為 text 的 欄 位 儲 存 在 資 料 庫 裡 的 , 不 過 它 們 必 須 是 狀 態 值 資 料 型 別 的 合 法 的 外 部 表 現 形 式 的 常 量 。 如 果 沒 有 提 供 狀 態 , 那 麼 狀 態 值 初 始 化 為 NULL。
如 果 該 狀 態 轉 換 函 式 被 定 義 為 "strict", 那 麼 就 不 能 用 NULL 輸 入 呼 叫 它 。 這 個 時 候 , 帶 有 這 樣 的 轉 換 函 式 的 聚 集 執 行 起 來 的 現 象 如 下 所 述 。 NULL 輸 入 的 值 被 忽 略 ( 不 呼 叫 此 函 式 並 且 保 留 前 一 個 狀 態 值 ) 。 如 果 初 始 狀 態 值 是 NULL, 那 麼 由 第 一 個 非 NULL 值 替 換 該 狀 態 值 , 而 狀 態 轉 換 函 式 從 第 二 個 非 NULL 的 輸 入 值 開 始 呼 叫 。 這 樣 做 讓 我 們 比 較 容 易 實 現 象 max 這 樣 的 聚 集 。 請 注 意 這 種 行 為 只 是 當 state_type 與 input_data_type 相 同 的 時 候 才 表 現 出 來 。 如 果 這 些 型 別 不 同 , 你 必 須 提 供 一 個 非 NULL 的 初 始 條 件 或 者 使 用 一 個 非 strice的 狀 態 轉 換 函 式 。
如 果 狀 態 轉 換 函 式 不 是 strict( 嚴 格 ) 的 , 那 麼 它 將 無 條 件 地 為 每 個 輸 入 值 呼 叫 , 並 且 必 須 自 行 處 理 NULL 輸 入 和 NULL 轉 換 值 , 這 樣 就 允 許 聚 集 的 作 者 對 聚 集 中 的 空 值 有 完 全 的 控 制 。
如 果 終 轉 換 函 式 定 義 為 "strict", 則 如 果 最 終 狀 態 值 是 NULL 時 就 不 會 呼 叫 它 ; 而 是 自 動 輸 出 一 個 NULL的 結 果 。 ( 當 然 , 這 才 是 strict 函 式 的 正 常 特 徵 。 ) 不 管 是 那 種 情 況 , 終 處 理 函 式 可 以 選 擇 返 回 NULL。 比 如 , avg 的 終 處 理 函 式 在 零 輸 入 記 錄 時 就 會 返 回 NULL。
PARAMETERS 引 數
|
name |
要 建 立 的 聚 集 函 式 名 ( 可 以 有 模 式 修 飾 的 ) 。 |
input_data_type
本 聚 集 函 式 要 處 理 的 基 本 資 料 型 別 。 對 於 不 檢 查 輸 入 型 別 的 聚 集 來 說 , 這 個 引 數 可 以 宣 告 為 "ANY"。 ( 比 如 count(*)) 。
|
sfunc |
用 於 處 理 源 資 料 列 裡 的 每 一 個 輸 入 資 料 的 狀 態 轉 換 函 式 名 稱 。 它 通 常 是 一 個 雙 引 數 的 函 式 , 第 一 個 引 數 的 型 別 是 state_data_type 而 第 二 個 引 數 的 型 別 是 input_data_type. 另 外 , 對 於 一 個 不 檢 查 輸 入 資 料 的 聚 集 , 該 函 式 只 接 受 一 個 型 別 為 state_data_type 的 引 數 。 不 管 是 哪 種 情 況 , 此 函 式 必 須 返 回 一 個 型 別 為 state_data_type的 值 。 這 個 函 式 接 受 當 前 狀 態 值 和 當 前 輸 入 資 料 條 目 , 而 返 回 下 個 狀 態 值 。 |
state_data_type
聚 集 的 狀 態 值 的 資 料 型 別 。
|
ffunc |
在 轉 換 完 所 有 輸 入 域 /欄 位 後 呼 叫 的 最 終 處 理 函 式 。 它 計 算 聚 集 的 結 果 。 此 函 式 必 須 接 受 一 個 型 別 為 state_data_type 的 引 數 。 聚 集 的 輸 出 資 料 型 別 被 定 義 為 此 函 式 的 返 回 型 別 。 如 果 沒 有 宣 告 ffunc 則 使 用 聚 集 結 果 的 狀 態 值 作 為 聚 集 的 結 果 , 而 輸 出 型 別 為 state_data_type。 |
initial_condition
狀 態 值 的 初 始 設 定 ( 值 ) 。 它 必 須 是 一 個 數 據 型 別 state_data_type 可 以 接 受 的 文 字 常 量 值 。 如 果 沒 有 宣 告 , 狀 態 值 初 始 為 NULL。
CREATE AGGREGATE 的 引 數 可 以 以 任 何 順 序 書 寫 , 而 不 只 是 上 面 顯 示 的 順 序 。
EXAMPLES 例 子
參 閱 ‘‘User-defined Aggregates’’
COMPATIBILITY 相 容 性
CREATE AGGREGATE 是 PostgreSQL 語 言 的 擴 充 套 件 。 在 SQL 標 準 裡 沒 有 CREATE AGGREGATE。
SEE ALSO 參 見
ALTER AGGREGATE [ alter_aggregate (7)], DROP AGGREGATE [ drop_aggregate (l)]
譯 者
Postgresql 中 文 網 站 何 偉 平 <laser@pgsqldb.org>
跋
本
頁 面 中 文 版 由
中 文 man 手 冊 頁 計
劃 提 供 。
中 文 man 手 冊 頁 計
劃 :
https://github.com/man-pages-zh/manpages-zh