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

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

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

Изменение: Windows, PostgreSQL v9.2.1

Ответ 1

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

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

Ответ 2

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

SELECT arr[array_upper(arr, 1)];