Как получить последний элемент массива в 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)];