Массив f1 имеет следующую структуру:
Внешний массив: [1:1] - содержит один элемент, индексированный с 1 по 1.
Первый уровень вложенности: [-2:-1] - содержит два элемента, индексированных с -2 по -1.
Второй уровень вложенности: [3:5] - содержит три элемента, индексированных с 3 по 5.
Можно визуализировать:
f1 = [
[ // Индекс 1 (внешний массив)
[1, 2, 3], // Индекс -2 (первый уровень)
[4, 5, 6] // Индекс -1 (первый уровень)
]
]
Ещё можно разобрать запрос по частям:
SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2: выбираем два элемента из массива f1 и даем им алиасы e1 и e2.
FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1): создаем подзапрос, который определяет массив f1.
'[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[]: создаем массив целых чисел с заданной структурой и значениями.
Чтобы получить доступ к элементу e1 (f1[1][-2][3]), можно сделать следующее:
- f1[1]: получаем доступ к единственному элементу внешнего массива (индекс 1).
- [-2]: выбираем элемент с индексом -2 из первого уровня вложенности - это массив [1, 2, 3].
- [3]: выбираем элемент с индексом 3 из этого массива - это число 1.
Так же и для e2 (f1[1][-1][5]):
- f1[1]: получаем доступ к единственному элементу внешнего массива.
- [-1]: выбираем элемент с индексом -1 из первого уровня вложенности - это массив [4, 5, 6].
- [5]: выбираем элемент с индексом 5 из этого массива - это число 6.
Кстати, в PostgreSQL индексация массивов начинается с 1. Отрицательные индексы отсчитываются с конца массива, а вложенные скобки указывают на уровень вложенности массива, так, на всякий случай.
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;
e1 | e2
----+----
1 | 6
(1 row)
Понимаю условно, что тут происходит, но как соотносятся три группы индексов с двумя подмассивами? не понимаю алгоритма работы этого запроса.
Вдруг тут кто-то сможет объяснить??