Рекурсивный обход jsonb поля
В таблице есть столбец dat. Он состоит из полей jsonb с большим уровнем вложенности, например { a: { b: { c: 'st', d: { e: '41', f: { g: '201-64', h: '4125,6} }, i:42}}}.
Как можно обойти его рекурсивно и найти ключ, значение которого содержит запятую? (в данном случае ключ h)
Или это можно сделать не рекурсией?
Ответы (1 шт):
Автор решения: Andrew Bystrov
→ Ссылка
with
recursive data (key, value) as (
select
null as key,
'{ "a": { "b": { "c": "st", "d": { "e": "41", "f": { "g": "201-64", "h": "4125,6"} }, "i":42}}, "qq":123}'::jsonb as value
union all
select
jsonb_object_keys(value) as key,
value -> jsonb_object_keys(value) as value
from data
where jsonb_typeof(value) = 'object'
)
SELECT
key,
value
FROM data
where jsonb_typeof(value) in ('string')
and position(',' in value::text) > 0
можно рекурсивно обойти json_object, где в ключах лежат объекты и потом вывести только те пары ключ-значение, у которых тип значение - строчка и эта строчка содержит запятую