Jika Anda dapat memutakhirkan ke Postgresql 9.5, jsonb_set
perintah itu tersedia, seperti yang disebutkan orang lain.
Dalam setiap pernyataan SQL berikut, saya telah menghilangkan where
klausa untuk singkatnya; jelas, Anda ingin menambahkan itu kembali.
Perbarui nama:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Ganti tag (sebagai lawan menambahkan atau menghapus tag):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Mengganti tag kedua (0-diindeks):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Tambahkan tag ( ini akan berfungsi selama ada kurang dari 999 tag; mengubah argumen 999 ke 1000 atau lebih menghasilkan kesalahan . Ini tidak lagi menjadi kasus di Postgres 9.5.3; indeks yang jauh lebih besar dapat digunakan) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Hapus tag terakhir:
UPDATE test SET data = data #- '{tags,-1}'
Pembaruan kompleks (hapus tag terakhir, masukkan tag baru, dan ubah nama):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Penting untuk dicatat bahwa dalam setiap contoh ini, Anda tidak benar-benar memperbarui satu bidang data JSON. Alih-alih, Anda membuat versi data sementara yang dimodifikasi, dan menetapkan versi yang diubah itu kembali ke kolom. Dalam praktiknya, hasilnya harus sama, tetapi mengingat hal ini harus membuat pembaruan yang kompleks, seperti contoh terakhir, lebih dapat dimengerti.
Dalam contoh kompleks, ada tiga transformasi dan tiga versi sementara: Pertama, tag terakhir dihapus. Kemudian, versi itu diubah dengan menambahkan tag baru. Selanjutnya, versi kedua ditransformasikan dengan mengubah name
bidang. Nilai dalam data
kolom diganti dengan versi final.