Как получить последний элемент массива в PostgreSQL?

на документация PostgreSQL по массивам пример использования [-1] для доступа к тому, что кажется последним элементом массива; однако пока SELECT arr[2:3]; производит {5,9}, arr[2:-1] результаты {}.

как можно получить последний элемент массива в PostgreSQL?

Edit: Windows, PostgreSQL v9.2.1

2 ответов


Я думаю, вы неправильно истолковываете пример. Массивы 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;

но эти негативные числа не индексируются из конца массивов, как в таких языках, как Perl. В FROM (SELECT ... часть, они указывают начальный и конечный индексы, поэтому -1 в 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]

если вы используете массивы на основе 1 по умолчанию, вы можете получить последний элемент с помощью простого arr[array_length(arr, 1)]. Если вы не используете значение по умолчанию [1:n] массивы, то вам придется возиться с array_lower и array_upper чтобы получить первый и последний элементы; или, в зависимости от обстоятельств, вы могли бы использовать unnest чтобы распаковать массив, затем работать с массивом в качестве набора строк.


для любого массива "arr", чтобы получить последний элемент массива arr используйте

SELECT arr[array_upper(arr, 1)];