У меня есть таблица базы данных, в которой один столбец содержит глубоко вложенное поле JSON. Примерно так:
create temporary table testing (id integer, contents json);
insert into testing values (1, '{
"level1": {
"level2": [
{
"level3": {
"a": {
"value1": 1,
"value2": 2
},
"b": {
"value1": 3,
"value2": 4
}
}
},
{
"level3": {
"d": {
"value1": 5,
"value2": 6
},
"e": {
"value1": 7,
"value2": 8
}
}
}
]
}
}
');
Я пытаюсь получить следующий результат:
| id | l2_label | data_label | value1 |
+----+----------+------------+--------+
| 1 | level2 | a | 1 |
| 1 | level2 | b | 3 |
| 1 | level2 | d | 5 |
| 1 | level2 | e | 7 |
Верхний уровень всегда называется «level1», но их может быть больше внутри там один ключ и "level2" не является фиксированной строкой. Каждый из этих ключей содержит массив объектов, которые могут иметь больше, чем ключ «level3», но я ищу только «level3». Внутри «a», «b», «c» может быть любая строка. Затем я ищу по одной строке для каждого значения "value1".
Я получил следующий запрос:
select id, key as l2_label, json_array_elements(value) from testing, json_each(contents -> 'level1');
, который возвращает
id | l2_label | json_array_elements
----+----------+--------------------------------------
1 | level2 | { +
| | "level3": { +
| | "a": { +
| | "value1": 1,+
| | "value2": 2 +
| | }, +
| | "b": { +
| | "value1": 3,+
| | "value2": 4 +
| | } +
| | } +
| | }
1 | level2 | { +
| | "level3": { +
но я не понимаю, как теперь распаковать элементы level3.
Мой вопрос, во-первых, как получить результат, который я ищу, а также советы о том, как построить такой запрос постепенно , так как я не знаю, как действовать с этим json_array_elements
сейчас.