Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Postgresql - как это работает? индексы массивов

A. Профи (548), на голосовании 4 месяца назад
сутки просидела, так и не разобралась:

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)

Понимаю условно, что тут происходит, но как соотносятся три группы индексов с двумя подмассивами? не понимаю алгоритма работы этого запроса.

Вдруг тут кто-то сможет объяснить??
Голосование за лучший ответ
damn Просветленный (47322) 5 месяцев назад
Массив 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]), можно сделать следующее:
  1. f1[1]: получаем доступ к единственному элементу внешнего массива (индекс 1).
  2. [-2]: выбираем элемент с индексом -2 из первого уровня вложенности - это массив [1, 2, 3].
  3. [3]: выбираем элемент с индексом 3 из этого массива - это число 1.

Так же и для e2 (f1[1][-1][5]):
  1. f1[1]: получаем доступ к единственному элементу внешнего массива.
  2. [-1]: выбираем элемент с индексом -1 из первого уровня вложенности - это массив [4, 5, 6].
  3. [5]: выбираем элемент с индексом 5 из этого массива - это число 6.

Кстати, в PostgreSQL индексация массивов начинается с 1. Отрицательные индексы отсчитываются с конца массива, а вложенные скобки указывают на уровень вложенности массива, так, на всякий случай.
A.Профи (548) 5 месяцев назад
Спасибо!! Я же верно понимаю, что с помощью подвыражения мы по сути индексируем исходный массив слева направо и выкидываем те элементы, для которых индексы не прописаны количественно?
Именно так все как раз сходится. Еще была проблема с пониманием обозначения внешнего уровня массива, вы с этим очень помогли!?? нейронка пишет чушь?
damn Просветленный (47322) По сути правильно, но с небольшой оговоркой. Подвыражение не "выкидывает" элементы в прямом смысле. Оно скорее описывает путь к конкретным элементам в многомерном массиве, используя индексы. Представь себе многоквартирный дом.
  • Внешний массив [1:1] - это как номер подъезда (в нашем случае всего один подъезд).
  • Первый уровень вложенности [-2:-1] - это этажи (с -2 по -1, то есть два этажа).
  • Второй уровень вложенности [3:5] - это номера квартир на каждом этаже (с 3 по 5, то есть три квартиры на этаже).
Когда ты пишешь f1[1][-2][3], ты как будто говоришь: "Мне нужен элемент, который находится в 1 подъезде, на -2 этаже, в 3 квартире". Таким образом, подвыражение не выбрасывает элементы, а указывает конкретный адрес элемента в многомерном массиве.
Jurijus Zaksas Искусственный Интеллект (445678) 5 месяцев назад
Там не два подмассива, а три. То есть они образуют третий собой. Посчитай количество фигурных скобок и все станет очевидно.
Похожие вопросы