Перейти к основному контенту

Функция удаления полей в данных JSONB

Если уже есть заполненные данные в body какого то Приложения и была правка метаданных в базе с удалением полей, при обновлении элемента приложения система будет ругаться. Чтобы почистить данные в body, необходимо в схеме создать функцию:

-- head - название схеме (площадки ELMA365)
CREATE OR REPLACE FUNCTION head.json_object_delete_keys("json" json, VARIADIC "keys_to_delete" TEXT[])
  RETURNS json
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
SELECT COALESCE(
  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
   FROM json_each("json")
   WHERE "key" <> ALL ("keys_to_delete")),
  '{}'
)::json
$function$;

После этого выполнить запрос по очистке данных:

-- где 'type', 'signatory_position', 'base_action', 'set_bank_details' - поля к удалению внутри body
update head."_clients:_companies"
set body = head.json_object_delete_keys(body::json, 'type', 'signatory_position', 'base_action', 'set_bank_details');