Я пытаюсь создать рекурсивный CTE в Postgres, который поддерживает как массивы, так и объекты, чтобы возвращать список пар ключ-значение и, похоже, не может найти хороший пример. Это мой текущий код.
with recursive jsonRecurse as
(
select
j.key as Path
,j.key
,j.value
from jsonb_each(to_jsonb('{
"key1": {
"key2": [
{
"key3": "test3",
"key4": "test4"
}
]
},
"key5": [
{
"key6":
[
{
"key7": "test7"
}
]
}
]
}'::jsonb)) j
union all
select
jr.path || '.' || jr2.Key
,jr2.key
,jr2.value
from jsonRecurse jr
left join lateral jsonb_each(jr.value) jr2 on true
where jsonb_typeof(jr.value) = 'object'
)
select
*
from jsonRecurse;
Как видите, рекурсия кода прекращается, как только я попадаю в массив вместо объекта. Я попытался поиграть с использованием оператора case и вместо этого поместил вызов функции jsonb_each или jsonb_array_element в оператор case, но я получаю сообщение об ошибке, говорящее мне вместо этого использовать боковые соединения.