Perbarui :untuk 9.5+, ada operator eksplisit yang dapat Anda gunakan dengan jsonb
(jika Anda memiliki json
kolom yang diketik, Anda dapat menggunakan gips untuk menerapkan modifikasi):
Menghapus kunci (atau indeks) dari objek JSON (atau, dari array) dapat dilakukan dengan -
operator:
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
Menghapus, dari jauh di dalam hierarki JSON dapat dilakukan dengan #-
operator:
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
Untuk 9.4, Anda dapat menggunakan versi modifikasi dari jawaban asli (di bawah), tetapi alih-alih menggabungkan string JSON, Anda dapat menggabungkan menjadi json
objek secara langsung dengan json_object_agg()
.
Terkait:manipulasi JSON lainnya di dalam PostgreSQL:
- Bagaimana cara mengubah bidang di dalam tipe data PostgreSQL JSON yang baru?
Jawaban asli (berlaku untuk PostgreSQL 9.3):
Jika Anda memiliki setidaknya PostgreSQL 9.3, Anda dapat membagi objek menjadi pasangan dengan json_each()
dan filter bidang yang tidak diinginkan, lalu buat json lagi secara manual. Sesuatu seperti:
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
Dengan 9.2 (atau lebih rendah) tidak mungkin.
Sunting :
Bentuk yang lebih mudah adalah membuat fungsi, yang dapat menghapus sejumlah atribut dalam json
bidang:
Edit 2 :string_agg()
lebih murah daripada 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$;
Dengan fungsi ini, yang perlu Anda lakukan hanyalah menjalankan kueri di bawah ini:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');