Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1750666
  • 博文数量: 100
  • 博客积分: 10122
  • 博客等级: 上将
  • 技术积分: 4092
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-04 20:28
文章分类

全部博文(100)

文章存档

2010年(2)

2009年(28)

2008年(70)

我的朋友

分类:

2009-11-12 19:48:20

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 是最终返回元素类型。

详细参考:




阅读(1768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~