Как выбрать столбец json-объектов в Postgres, чтобы возвращаемые строки были массивами json-массивов? - PullRequest
1 голос
/ 01 июля 2019

У меня есть таблица с одним столбцом jsonb. Как выполнить запрос на выборку, который преобразует каждую строку jsonb в массив jsonb, где каждый элемент является другим массивом, в котором первый индекс является ключом, а второй индекс является значением? Ключи не известны заранее.

Выбор столбца с этим запросом:

SELECT myRow FROM myTable

возвращает строки со следующими значениями jsonb:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
}

Я хочу, чтобы выходные строки выглядели так:

[
    ["key1", "value1"],
    ["key2", "value2"],
    ["key3", "value3"],
    ["key4", "value4"],
    ["key5", "value5"]
]

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Запрос S-Man объединит все строки из исходной таблицы в один большой массив.Из твоего вопроса немного неясно, хочешь ты этого или нет.Если вы хотите, чтобы каждая строка имела собственный массив, вы можете сделать что-то вроде этого:

select arr 
from data 
join lateral(
    select jsonb_agg(jsonb_build_array(key, value)) arr 
    from jsonb_each(j)
) sub on true;

Вот пример использования некоторых данных из CTE:

with data(j) as (
  select '{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  }'::jsonb 
  UNION select '{"key6": "value6"}'
)
select arr 
from data 
join lateral(
  select jsonb_agg(jsonb_build_array(key, value)) arr 
  from jsonb_each(j)
) sub on true;
                                                 arr
------------------------------------------------------------------------------------------------------
 [["key6", "value6"]]
 [["key1", "value1"], ["key2", "value2"], ["key3", "value3"], ["key4", "value4"], ["key5", "value5"]]
(2 rows)
1 голос
/ 01 июля 2019

пошаговая демонстрация: db <> fiddle

SELECT
    json_agg(arr)
FROM
    my_table,
    json_each(my_row),
    json_build_array(key, value) as arr
  1. json_each расширяет ваш объект json в одну строку для каждого атрибута.Он создает один столбец для ключей и один для значений.
  2. json_build_array создает внутренние массивы для каждой записи
  3. json_agg объединяет массивы из (2) в огромный.
...