POSTGRESQL: не удалось объединить несколько строк Jsonb в одну строку - PullRequest
1 голос
/ 25 апреля 2020

Необходимо объединить все строки моего единственного столбца jsonb.

Например: мой столбец jsonb имеет строки, как показано ниже.

Мои входные данные (2 строки):

{"room": ["101"],"equipments": ["thermometer"]}
{"room": ["101","102"], "equipments": ["stethescope"]}

при выполнении этого запроса

select (jsonb_each(jsonbcolumn)).* 
from table group by key, value

я получаю следующий вывод:

    key         |       value
    equipments  |     ["stethescope"] 
    equipments  |     ["thermometer"]
    room        |     ["101","102"] 
    room        |     ["101"]

Если я пытаюсь сгруппировать по ключу, добавьте значения, используя jsonb_object_agg, jsonb удаляет первое значение и сохраняет только второе значение.

{"room": ["101","102"],"equipments": ["stethescope"]}

Если я попытаюсь использовать json_object_agg, я получу повторяющиеся значения

{ "room" : ["101"], "equipments" : ["thermometer"], "room" : ["101", "102"], "equipments" : ["stethescope"] }

Мой ожидаемый результат -

{"room": ["101","102"], "equipments":["stethescope", "thermometer"]}

в одной строке.

Опробовал почти все решения в net. Вот несколько ссылок, которые я попробовал.

1 Ответ

1 голос
/ 25 апреля 2020

Единственное решение, которое я могу придумать, это:

select jsonb_build_object(
          'room', jsonb_agg(distinct r.room), 
          'equipments', jsonb_agg(distinct e.equipment) 
       )
from data d
  cross join jsonb_array_elements_text(d.jsonbcolumn -> 'room') as r(room)
  cross join jsonb_array_elements_text(d.jsonbcolumn -> 'equipments') as e(equipment)

, но это будет крайне неэффективно (но это цена, которую вы платите за отмену нормализации)

Онлайн пример

...