выберите или извлеките все ключевые значения внутри данных jsonb в postgres

#json #postgresql #jsonb

#json #postgresql #jsonb

Вопрос:

У меня есть столбец jsonb в моей таблице postgres, и данные заполняются и хранятся в нем.

Вот примерный формат данных, которые хранятся в столбце jsonb

 {
    "unknown_value1": {
        "code": "code 1",
        "title": "sample title 1",
        "parent_title": "parent1",
        "framework_code": "ABC"
    },
    "unknown_value2": {
        "code": "code 2",
        "title": "sample title 2",
        "parent_title": "parent2",
        "framework_code": "ABC"
    }
}
  

Теперь мне нужно извлечь все значения из ключа ‘parent_title’ без указания самого внешнего ключа (unknown_value1, unknown_value2).

Самые внешние ключи неизвестны, это может быть любое значение, изменения для каждого данные.

Но ключ внутри json (code, title, parent_title и framework_code) является постоянным, он не изменится ни для какого значения.

Помогите мне извлечь эти данные jsonb.

Заранее спасибо!

Ответ №1:

Используйте каскадное jsonb_each() соединение в боковом соединении:

 with data(json_value) as (
values (
    '{
        "unknown_value1": {
            "code": "code 1",
            "title": "sample title 1",
            "parent_title": "parent1",
            "framework_code": "ABC"
        },
        "unknown_value2": {
            "code": "code 2",
            "title": "sample title 2",
            "parent_title": "parent2",
            "framework_code": "ABC"
        }
    }'::jsonb)
)

select j1.key as outer_key, j2.key, j2.value
from data
cross join lateral jsonb_each(json_value) j1
cross join lateral jsonb_each(value) j2

   outer_key    |      key       |      value       
---------------- ---------------- ------------------
 unknown_value1 | code           | "code 1"
 unknown_value1 | title          | "sample title 1"
 unknown_value1 | parent_title   | "parent1"
 unknown_value1 | framework_code | "ABC"
 unknown_value2 | code           | "code 2"
 unknown_value2 | title          | "sample title 2"
 unknown_value2 | parent_title   | "parent2"
 unknown_value2 | framework_code | "ABC"
(8 rows)