Как сохранить свойства только от объекта jsonb Postgres, который существует в массиве ключей? - PullRequest
1 голос
/ 12 июля 2019

У меня есть jsonb объект с многочисленными свойствами, и у меня есть массив ключей Postgres, которые я хочу извлечь из объекта в новый урезанный объект.

Если мой объект:

'{"foo": true, "bar": 2, "baz": "cat", "other": "Some text"}'::jsonb

и мой массив свойств для извлечения '{foo,other}', мой желаемый результат:

'{"foo": true, "other": "Some text"}'::jsonb

Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Заимствование из этого ответа ...

select jsonb_object_agg(key,value)
from jsonb_each('{"foo": true, "bar": 2, "baz": "cat", "other": "Some text"}'::jsonb)
where key = any('{foo,other}')

jsonb_each превращает JSON в таблицу из столбцов key (текст) и value (jsonb), которые затем можно запрашивать в обычном режиме.

where key = any('{foo,other}') в основном where key in ('foo', 'other'), но для массивов.

Наконец, jsonb_object_agg(key,value) объединяет все соответствующие строки в один объект JSON.

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

Вы можете сделать это так:

SELECT jsonb_object_agg(elem.key, elem.val)
FROM (jsonb_each(
         JSONB '{"foo": true, "bar": 2, "baz": "cat", "other": "Some text"}'
     ) AS elem(key, val)
   JOIN (unnest(
            TEXT[] '{foo,other}'
        ) AS filter(key) USING (key);
...