为什么 PostgreSQL 允许查询 array[0] 即使它使用基于 1 的数组?

Ada*_*tan 15 postgresql array postgresql-9.3

我一直在我的一个 PostgreSQL 数据库中使用数组。

我创建了一个包含至少一个元素的几何数组的表:

CREATE TABLE test_arrays (
    polygons geometry(Polygon,4326)[],
    CONSTRAINT non_empty_polygons_chk 
        CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);
Run Code Online (Sandbox Code Playgroud)

我添加了几行,并在表中查询每个几何数组中的第一个元素:

SELECT polygons[0] FROM test_arrays;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我得到了一个空行列表!

经过一些研究,事实证明PostgreSQL 数组是基于一个的

数组下标数字写在方括号内。默认情况下,PostgreSQL 使用基于 1 的数组编号约定,即 n 个元素的数组以 array[1] 开头,以 array[n] 结尾。

所以SELECT polygons[0] FROM test_arrays;工作并返回polygon每一行的第一行。

如果 PostgreSQL 使用基于 1 的编号约定,为什么允许查询第 0 个元素,结果是否有任何意义?

Erw*_*ter 16

Postgres 数组默认从 1 开始。在典型的应用程序中,最好坚持使用默认值。但是语法允许以任何 integer数字开头。文档:

下标赋值允许创建不使用基于一的下标的数组。例如,可以分配 tomyarray[-2:7]创建一个下标值从 -2 到 7 的数组。

例子:

SELECT ('[0:2]={1,2,3}'::int[])[0];    --> 1
SELECT ('[-7:-5]={1,2,3}'::int[])[-6]; --> 2 
Run Code Online (Sandbox Code Playgroud)

您可以查询数组的任何索引,如果它不存在,您将获得 NULL。

有关的: