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: [email protected] ]

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

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

结束

你可能感兴趣的:(PostgreSQL)