Рекурсивный обход 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, где в ключах лежат объекты и потом вывести только те пары ключ-значение, у которых тип значение - строчка и эта строчка содержит запятую

→ Ссылка