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

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

A. Профи (541), открыт 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)

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

Вдруг тут кто-то сможет объяснить??
3 ответа
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ Просветленный (39292) 1 неделю назад
Массив 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.Профи (541) 1 неделю назад
Спасибо!! Я же верно понимаю, что с помощью подвыражения мы по сути индексируем исходный массив слева направо и выкидываем те элементы, для которых индексы не прописаны количественно?
Именно так все как раз сходится. Еще была проблема с пониманием обозначения внешнего уровня массива, вы с этим очень помогли!?? нейронка пишет чушь?
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ Просветленный (39292) По сути правильно, но с небольшой оговоркой. Подвыражение не "выкидывает" элементы в прямом смысле. Оно скорее описывает путь к конкретным элементам в многомерном массиве, используя индексы. Представь себе многоквартирный дом.
  • Внешний массив [1:1] - это как номер подъезда (в нашем случае всего один подъезд).
  • Первый уровень вложенности [-2:-1] - это этажи (с -2 по -1, то есть два этажа).
  • Второй уровень вложенности [3:5] - это номера квартир на каждом этаже (с 3 по 5, то есть три квартиры на этаже).
Когда ты пишешь f1[1][-2][3], ты как будто говоришь: "Мне нужен элемент, который находится в 1 подъезде, на -2 этаже, в 3 квартире". Таким образом, подвыражение не выбрасывает элементы, а указывает конкретный адрес элемента в многомерном массиве.
Jurijus Zaksas Искусственный Интеллект (430804) 1 неделю назад
Там не два подмассива, а три. То есть они образуют третий собой. Посчитай количество фигурных скобок и все станет очевидно.
Похожие вопросы