Как контролировать порядок полей в jsonb_object_agg

Я пытаюсь создать объект jsonb с ключами, упорядоченными в алфавитном порядке. Однако кажется, что jsonb_object_agg(k, v) игнорирует порядок ввода и сортирует ввод по длине ключа, а затем по алфавиту.

E.g.

select jsonb_object_agg(k, v order by k) from (
    values ('b', 'b_something'), ('ab', 'ab_something')
) as t (k,v)

дает

{
  "b": "b_something",
  "ab": "ab_something"
}

но то, что мне нужно, это

{
  "ab": "ab_something"
  "b": "b_something",
}

Есть ли способ добиться этого?

Контекст. Я сглаживаю столбец json, содержимое которого следует однородной, но громоздкой схеме. Мне удалось это сделать благодаря этому полезному ответу, но порядок ключей мне не нужен.


person AdamAL    schedule 27.03.2021    source источник
comment
Напротив, jsonb не сохраняет пробелы, не сохраняет порядок ключей объектов , и не хранит повторяющиеся ключи объектов. Поэтому, если вы хотите сохранить порядок ключей, используйте вместо этого json_object_agg().   -  person Abelisto    schedule 27.03.2021


Ответы (1)


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

Вы можете использовать тип данных json, который по сути представляет собой строку с проверкой синтаксиса и сохраняет исходный порядок.

Чтобы установить порядок во время агрегации, используйте json_agg(... ORDER BY ...).

person Laurenz Albe    schedule 27.03.2021