Что такое вызов PostgreSQL для удаления всего объекта из массива объектов JSONB - PullRequest
1 голос
/ 18 июня 2020

таблица: TEST1 jsonB column: COLUMN1

[{a: 1, b: 2, c:3},
{a: 4, b: 5, c:6},
{a: 7, b: 8, c:9}]

Я хочу выбрать значение a = 4 и удалить весь объект, частью которого он является, для результата, как показано ниже [{a: 1, b: 2, c:3}, {a: 7, b: 8, c:9}]

Я могу найти запись с помощью WHERE COLUMN1->>'a' = 4

, но я не смог выяснить или как найти этот базовый c вариант использования: например, удалить объект из массива как часть столбец JSONB

Для одной или нескольких записей

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Да, вы можете использовать логику фильтрации c в обратном порядке как WHERE COLUMN1->>'a' != 4, заменив равенство неравенством вкладом функции jsonb_array_elements(), а затем применив функцию jsonb_agg(), как показано ниже:

SELECT ID, jsonb_agg(elm) AS "Result"
  FROM tab t
 CROSS JOIN jsonb_array_elements(jsdata) AS elm
 WHERE (elm ->> 'a')::int != 4
 GROUP BY ID

Демо

1 голос
/ 25 июля 2020

CREATE TABLE tab (ID INT, jsdata jsonb)

INSERT INTO tab VALUES (1, '[{"a": 1, "b": 2, "c": 3}, {"a": 4, "b": 5, "c": 6}, {"a": 7, "b": 8, "c": 9}] ':: jsonb), (2, '[{"a": 4, "b": 2, "c": 3}, {"a": 9, "b": 5, "c": 6}, { "a": 7, "b": 8, "c": 9}] ':: jsonb)

вкладка UPDATE t1 SET jsdata = (SELECT jsonb_agg (elm) FROM tab t2 CROSS JOIN jsonb_array_elements (jsdata) AS elm WHERE (elm - >> 'a') :: int! = 4 AND t2.ID = 2 GROUP BY t2.ID) WHERE t1.ID = 2

RESULT: 1, ' [{"a": 1, "b": 2, "c": 3}, {"a": 4, "b": 5, "c": 6}, {"a": 7, "b": 8, "c": 9}] ', 2,' [{"a": 9, "b": 5, "c": 6}, {"a": 7, «b»: 8, «c»: 9}] '

...