[PostgreSQL]PostgreSQL 的generate_subscripts

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

开始

生成数组下标值:

复制代码
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,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
27天前
|
关系型数据库 PostgreSQL
postgresql安装
postgresql安装
40 8
|
8月前
|
SQL 存储 关系型数据库
PostgreSQL
PostgreSQL 是一款功能强大的开源关系型数据库管理系统,它支持 SQL(结构化查询语言)并提供了许多高级功能,如存储过程、视图、触发器、自定义数据类型等。PostgreSQL 适用于许多场景,如 Web 应用、数据仓库、科学计算等。
59 3
|
9月前
|
存储 关系型数据库 数据库连接
PostgreSQL很多优秀的书籍
PostgreSQL很多优秀的书籍
379 1
|
存储 网络协议 安全
tlinux 3.1 安装 postgresql 13.x
TencentOS Server 3.1 安装 PostgreSQL 13.x
222 0
tlinux 3.1 安装 postgresql 13.x
|
存储 Ubuntu 关系型数据库
PostgreSQL安装和使用
[TOC] ### postgresql安装 window - - - [一、安装](https://edu.csdn.net/skill/pg/pg-940afa6d71af44f689011ded8fd91a98?category=594&typeId=20367#_2) - [二、初始化配置](https://edu.csdn.net/skill/pg/pg-940afa6d71af44f689011ded8fd91a98?category=594&typeId=20367#_27) - [三、启动](https://edu.csdn.net/skill/pg/p
386 0
|
关系型数据库 PostgreSQL Linux
安装postgresql
安装postgresql yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.
1150 0
|
关系型数据库 PostgreSQL Ubuntu
|
关系型数据库 PostgreSQL Ubuntu
|
关系型数据库 PostgreSQL