Postgresql получает ключи из массива объектов в поле JSONB - PullRequest
1 голос
/ 07 мая 2019

Здесь 'фиктивные данные для столбца jsonb

[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]

Я хочу получить все значения ключей имен из массива объектов jsonb ... ожидая вывода -

[ [ "sun11", "sun12" ], [ "sun12", "sun13" ], [ "sun14", "sun15" ] ]

Проблема в том, что я могу получить значение ключа имени, указав индекс 0, 1 и т. Д.

SELECT data->0->'name' FROM public."user";
[ "sun11", "sun12" ]

Но я не могу получить все значения ключей имен из одного массива объекта. Я просто хочу получить все значения ключей из массива объекта json. Любая помощь будет полезна. Спасибо

1 Ответ

1 голос
/ 07 мая 2019

demo: db <> fiddle (сначала завершающий запрос, промежуточные шаги ниже)

WITH data AS (
    SELECT '[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]'::jsonb AS jsondata
)
SELECT 
    jsonb_agg(elems.value -> 'name')    -- 2
FROM 
    data,
    jsonb_array_elements(jsondata) AS elems -- 1
  1. j sonb_array_elements() расширяет каждый элемент массива в одну строку
  2. -> оператор дает массив для имени атрибута;после этого jsonb_agg() снова помещает все извлеченные массивы в один.
...