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

6tdlim6h  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(4)|浏览(484)

PostgreSQL Documentation on arrays提供了一个使用[-1]访问数组最后一个元素的示例;然而,当SELECT arr[2:3];产生{5,9}时,arr[2:-1]产生{}
如何在PostgreSQL中获得数组的最后一个元素?
编辑:Windows,PostgreSQL v9.2.1

umuewwlo

umuewwlo1#

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

SELECT arr[array_upper(arr, 1)];
gcxthw6b

gcxthw6b2#

我认为你误解了这个例子。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 ...部分,它们指定了开始和结束索引,因此f1[1][-1][5]中的-1只是一个普通的旧索引。考虑以下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解包数组,然后将数组作为行集使用。

bt1cpqcv

bt1cpqcv3#

如果有人使用Postgre 9.5,documentation说:
-> int
获取JSON数组元素(从零开始索引,负整数从末尾开始计数)
这对我来说很有效:

to_json(arr)->-1
yhived7q

yhived7q4#

我有一个我不喜欢的案例:

  • 引用数组两次as suggested here(因为数组是复杂的数组表达式)
  • 使用JSON解决方法as suggested here(因为数组可以是任何不兼容JSON的类型)

所以,另一个选择是使用UNNEST .. WITH ORDINALITY

SELECT
  a,
  (
    SELECT v 
    FROM unnest(a) 
    WITH ORDINALITY AS t (v, o) 
    ORDER BY o DESC 
    LIMIT 1
  )
FROM (VALUES (ARRAY[1, 3, 2])) AS t (a)

制作:

|a      |v  |
|-------|---|
|{1,3,2}|2  |

当然,假设没有对WITH ORDINALITYLIMIT 1的组合进行巧妙的优化,在最坏的情况下,这将找到O(N log N)中的最后一个数组元素(由于排序),而不是O(1),但有时,数组足够小,有时,没有任何其他方法。

相关问题