[PostgreSQL]PostgreSQL 的generate_subscripts

开始

生成数组下标值:

复制代码
postgres=# select generate_subscripts( array['a','b','c','d'],1);
 generate_subscripts 
---------------------
                   1
                   2
                   3
                   4
(4 rows)

postgres=# select generate_subscripts( array[array['a','b'],array['c','d'],array['e','f']],1);
 generate_subscripts 
---------------------
                   1
                   2
                   3
(3 rows)

postgres=# select generate_subscripts( array[array['a','b'],array['c','d'],array['e','f']],2);
 generate_subscripts 
---------------------
                   1
                   2
(2 rows)
postgres=# 
复制代码

再看一个 postgresql 的官方例子:

http://www.postgresql.org/docs/8.4/static/xfunc-sql.html

复制代码
CREATE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
    SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;

SELECT mleast(10, -1, 5, 4.4);
 mleast 
--------
     -1
(1 row)
复制代码
复制代码
postgres=# select mleast(10.1,3,4,1.5);
 mleast 
--------
    1.5
(1 row)

postgres=# 
复制代码

对其中的 SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i), 感觉还是有一点费解的。

没有关系,让我来作几个实验:

复制代码
postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
postgres$#     SELECT $1[2]  FROM generate_subscripts($1, 1) g(i);
postgres$# $$ LANGUAGE SQL;
CREATE FUNCTION
postgres=# 
postgres=# select mleast(10.1,1.1,2.2,4.4);
 mleast 
--------
1.1
(1 row)

postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
postgres$#     SELECT $1[3]  FROM generate_subscripts($1, 1) g(i);
postgres$# $$ LANGUAGE SQL;
CREATE FUNCTION
postgres=# 
postgres=# select mleast(10.1,1.1,2.2,4.4);
 mleast 
--------
2.2
(1 row)

postgres=# 
复制代码

再把 g(i) 换个名称试验一下:

复制代码
postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
postgres$#     SELECT $1[2]  FROM generate_subscripts($1, 1) gao(i);
postgres$# $$ LANGUAGE SQL;
CREATE FUNCTION
postgres=# 
postgres=# select mleast(10.1,1.1,2.2,4.4);
 mleast 
--------
1.1
(1 row)

postgres=# 
postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
postgres$#     SELECT min($1[i]) FROM generate_subscripts($1, 1) gao(i);
postgres$# $$ LANGUAGE SQL;
CREATE FUNCTION
postgres=# 
postgres=# select mleast(10.1,1.1,2.2,4.4);
 mleast 
--------
1.1
(1 row)

postgres=# 
复制代码

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

可以看到,所谓 g(i) 就是把 generate_subscripts($1,1) 的下标拿到,形成一个数组。第(i)个元素就是 g(i)。

而min($1[i]) 却是个集合运算,此时 $1[i] 其实代表了 $1[1],$1[2],$1[3]... ,是集合。虽然这看上去有些诡异。 

结束




本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/09/2762523.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值