PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:Hapus atribut dari kolom JSON

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');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengonversi bilangan bulat menjadi string sebagai bagian dari kueri PostgreSQL?

  2. Mengotomatiskan Tugas Harian PostgreSQL Menggunakan Jenkins

  3. Bagaimana cara membuat indeks unik di mana urutan kolom tidak diperhitungkan (set?)

  4. Ubah tipe data kolom menjadi serial

  5. Bagaimana mengubah tipe data kolom dari karakter ke numerik di PostgreSQL 8.4