Перебрать каждый элемент в массиве JSON и соединиться со строками

Я пытаюсь написать 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.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете разложить с помощью бокового соединения и 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)

Это невероятно. Как я могу узнать больше об этой технике? Материал, который я нашел для боковых соединений, очень сложен, и я не мог заставить ни один из них работать, это так просто. Я действительно хочу узнать, что означают некоторые из них, особенно обозначения i(info).

Özenç B. 24.12.2020 15:28

@ÖzençB.: документация — хорошее место для начала. См. раздел "7.2.1.5. Подзапросы LATERAL".

GMB 24.12.2020 16:00

Другие вопросы по теме