PostgreSQL支持自建 aggregate function,以下例子创建了一个称为 longest_text的聚合函数,该函数可应用于各种类型数据。
CREATE OR REPLACE FUNCTION longer_text(anyelement, anyelement)
RETURNS anyelement AS
$$
SELECT a[i] AS element FROM (SELECT ARRAY[$1, $2] AS a) AS foo
CROSS JOIN generate_series(1, 2) as i
WHERE a[i] IS NOT NULL
ORDER BY char_length(a[i]::text) DESC LIMIT 1
$$
LANGUAGE 'sql' IMMUTABLE;
DROP AGGREGATE IF EXISTS longest_text(anyelement);
CREATE AGGREGATE longest_text(anyelement) (
SFUNC = longer_text,
STYPE = anyelement
);
|
以下代码比较了 max 和 longest_text 的输出:
SELECT max(proname), longest_text(proname) from pg_proc
|
简单分析:
# longer_text
是一个应用于两个 anyelement 函数
# longest_text 通过将
longer_text 用于每个元素: SFUNC 意思是 state
transition
function 第一个参数为前状态,第二个参数为当前元素,起始状态默认为 NULL。 STYPE 是最终返回元素类型。
详细参考:
阅读(1353) | 评论(0) | 转发(0) |