Актуализиране :за 9.5+ има изрични оператори, които можете да използвате с jsonb
(ако имате json
въведена колона, можете да използвате cast, за да приложите модификация):
Изтриването на ключ (или индекс) от JSON обект (или от масив) може да се извърши с -
оператор:
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
Изтриването от дълбоко в йерархията на JSON може да се извърши с #-
оператор:
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
За 9.4 можете да използвате модифицирана версия на оригиналния отговор (по-долу), но вместо да агрегирате JSON низ, можете да агрегирате в json
обект директно с json_object_agg()
.
Свързани:други JSON манипулации в PostgreSQL:
- Как да променя полета в новия PostgreSQL JSON тип данни?
Оригинален отговор (отнася се за PostgreSQL 9.3):
Ако имате поне PostgreSQL 9.3, можете да разделите обекта си на двойки с json_each()
и филтрирайте нежеланите си полета, след което изградете json отново ръчно. Нещо като:
SELECT data::text::json AS before,
('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text
С 9.2 (или по-ниска) това не е възможно.
Редактиране :
По-удобна форма е да създадете функция, която може да премахне произволен брой атрибути в json
поле:
Редактиране 2 :string_agg()
е по-евтино от array_to_string(array_agg())
CREATE OR REPLACE FUNCTION "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$;
С тази функция всичко, което трябва да направите, е да изпълните заявката по-долу:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');