[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]... ,是集合。虽然这看上去有些诡异。
结束