Извлечь пары ключ-значение из массива объектов - PullRequest
0 голосов
/ 06 мая 2020

У меня есть таблица с названием «яблоки», которая выглядит так:

| not_a_pk | data (jsonb)                                                                                                                 |
|----------|-----------------------------------------------------------------------------------------------------------------------|
| 1        | [{"key":"color", "value":"red", "notes":"good apple"}, {"key":"size", "value":"large", "notes":"pretty large apple"}] |
| 2        | [{"key":"color", "value":"green", "notes":"too green"}, {"key":"size", "value":"small", "notes":"could be bigger"}]   |
| 2        | [{"key":"color", "value":"purple", "notes":"weird"}, {"key":"size", "value":"miniscule", "notes":"actually a grape"}] |

Я хотел бы извлечь часть объекта с ключами «ключ» и «значение», а также группу by not_a_pk, чтобы он выглядел так:

| not_a_pk | data                                                                                                                                        |
|----------|---------------------------------------------------------------------------------------------------------------------------------------------|
| 1        | [{"key":"color", "value":"red"}, {"key":"size", "value":"large"}]                                                                           |
| 2        | [{"key":"color", "value":"green"}, {"key":"size", "value":"small"}, {"key":"color", "value":"purple"}, {"key":"size", "value":"miniscule"}] |

Я смог просто получить все значения под одним ключом, например {"key": ["color", "size", " color "," size "]} но я не могу понять, как сохранить их как обычные объекты с отдельными ключами.

1 Ответ

3 голосов
/ 06 мая 2020

Вам нужно разложить элементы массива, построить новые JSON объекты, а затем объединить их обратно в массив:

select a.not_a_pk, 
       jsonb_agg(jsonb_build_object('key', x.item -> 'key', 'value', x.item -> 'value')) as data
from apples a
  cross join jsonb_array_elements(a.data) as x(item)
group by a.not_a_pk
order by a.not_a_pk;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...