aktualisieren: für 9.5+, gibt es explizite Operatoren, die Sie mit jsonb
verwenden können (wenn Sie eine json
getippt Spalte haben, können Sie Abgüsse verwenden, um eine Änderung zu beantragen):
Löschen eines Schlüssels (oder ein index) von einem JSON Objekt (oder aus einem Array) kann mit dem -
Führer durchgeführt werden:
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
Löschen, aus der tiefe in einer JSON Hierarchie kann mit dem #-
Führer durchgeführt werden:
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
Für 9.4 können Sie eine modifizierte Version der ursprünglichen Antwort (unten) verwenden, sondern stattdessen einen JSON-String zu aggregieren, können Sie in ein json
Objekt direkt mit json_object_agg()
aggregieren.
Verwandte: andere JSON Manipulationen whithin PostgreSQL:
Ursprüngliche Antwort (gilt für PostgreSQL 9.3):
Wenn Sie mindestens PostgreSQL 9.3 haben, können Sie Teilen Sie Ihr Objekt in Paare mit json_each()
und filtern Sie Ihre unerwünschten Felder, dann bauen Sie den JSON wieder manuell auf. Etwas wie:
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
Mit 9.2 (oder niedriger) ist es nicht möglich.
bearbeiten:
Eine bequemere Form ist, eine Funktion zu schaffen, die eine beliebige Anzahl von Attributen in einem json
Feld entfernen:
Edit 2: string_agg()
ist weniger teuer als 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$;
Mit dieser Funktion müssen Sie nur die Abfrage belo ausführen w:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');
Was ist Ihre Postgres-Version? – pozs