Я пытаюсь написать SQL-запрос, который соединяет каждую строку со своими собственными элементами массива JSON. Допустим, это данные, которые у нас есть (я знаю, это не имеет особого смысла):
| id | name | info |
|----|------|-------------------------------------------------|
| 1 | john | [{score: 20, point: 10},{score: 25, point: 15}] |
| 2 | jane | [{score: 25, point: 15},{score: 35, point: 45}] |
То, что я пытаюсь получить в конечном результате, выглядит так:
| id | name | score | point |
|----|------|-------|-------|
| 1 | john | 20 | 10 |
| 1 | john | 25 | 15 |
| 2 | jane | 25 | 15 |
| 2 | jane | 35 | 45 |
Как я могу написать запрос, который выполняет эту работу? У меня нет грантов для создания новой функции, поэтому это должны быть чисто операторы выбора, а не материал plpgsql.
Вы можете разложить с помощью бокового соединения и json[b]_array_elements
:
select t.id, t.name, i.obj ->> 'score' as score, i.obj ->> 'point' as point
from mytable t
cross join lateral jsonb_array_elements(t.info) i(info)
@ÖzençB.: документация — хорошее место для начала. См. раздел "7.2.1.5. Подзапросы LATERAL".
Это невероятно. Как я могу узнать больше об этой технике? Материал, который я нашел для боковых соединений, очень сложен, и я не мог заставить ни один из них работать, это так просто. Я действительно хочу узнать, что означают некоторые из них, особенно обозначения
i(info)
.