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

11 arrays postgresql indexing

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

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

编辑:Windows,PostgreSQL v9.2.1

小智 24

对于任何数组"arr",要获取数组arr的最后一个元素

SELECT arr[array_upper(arr, 1)];
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 18

我认为你错误地解释了这个例子.PostgreSQL数组不必从1索引n,这只是默认值:

默认情况下,PostgreSQL对数组使用基于一的编号约定,即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;
Run Code Online (Sandbox Code Playgroud)

但是这些负数并没有像在Perl这样的语言中从数组的末尾开始索引.在该FROM (SELECT ...部分中,它们指定了起始和结束索引,因此-1 in f1[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]
Run Code Online (Sandbox Code Playgroud)

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


igo*_*rkf 11

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

-> int

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

所以这对我有用:

to_json(arr)->-1
Run Code Online (Sandbox Code Playgroud)