30

关于数组的PostgreSQL 文档提供了一个示例,[-1]用于访问似乎是数组的最后一个元素;然而,虽然SELECT arr[2:3];产生{5,9}arr[2:-1]结果{}

在PostgreSQL中如何获取数组的最后一个元素?

编辑:Windows,PostgreSQL v9.2.1

4

3 回答 3

52

对于任何数组“arr”,要获取数组 arr 的最后一个元素,请使用

SELECT arr[array_upper(arr, 1)];
于 2018-01-08T07:44:16.430 回答
31

我认为你误解了这个例子。PostgreSQL 数组不必从 1 索引到n这只是默认值

默认情况下,PostgreSQL 对数组使用从 1 开始的编号约定,即一个包含n 个元素的数组以 . 开头array[1]和结尾array[n]

您正在查看的示例是这样的:

SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
 FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;

但是这些负数不像在 Perl 等语言中那样从数组的末尾开始索引。在该FROM (SELECT ...部分中,他们指定了开始和结束索引,因此 -1 inf1[1][-1][5]只是一个普通的旧索引。考虑这个array_dims结果:

=> SELECT array_dims('[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[]);
    array_dims     
-------------------
 [1:1][-2:-1][3:5]

如果您使用默认的基于 1 的数组,那么您可以使用简单的arr[array_length(arr, 1)]. 如果您不使用默认[1:n]数组,那么您将不得不弄乱array_lowerarray_upper获取第一个和最后一个元素;或者,根据具体情况,您可以使用unnest解包数组,然后将数组作为行集使用。

于 2012-10-07T04:16:17.243 回答
3

如果有人使用 Postgre 9.5,文档说:

-> int

获取 JSON 数组元素(从零开始索引,负整数从末尾开始计数)

所以这对我有用:

to_json(arr)->-1
于 2020-12-03T15:36:10.263 回答