Ответ 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
, чтобы распаковать массив, а затем работать с массивом как набор строк.