Jika Anda dapat meningkatkan ke Postgresql 9.5, jsonb_set
perintah tersedia, seperti yang telah disebutkan orang lain.
Dalam setiap pernyataan SQL berikut, saya telah menghilangkan where
klausa untuk singkatnya; jelas, Anda ingin menambahkannya 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 (diindeks 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Tambahkan tag (ini akan berfungsi selama tag kurang dari 999; mengubah argumen 999 ke 1000 atau lebih akan menghasilkan kesalahan . Ini tampaknya 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. Sebagai gantinya, Anda membuat versi data yang diubah sementara, dan menetapkan versi yang dimodifikasi itu kembali ke kolom. Dalam praktiknya, hasilnya harus sama, tetapi dengan mengingat hal ini, pembaruan yang rumit, seperti contoh terakhir, akan lebih mudah dipahami.
Dalam contoh kompleks, ada tiga transformasi dan tiga versi sementara:Pertama, tag terakhir dihapus. Kemudian, versi tersebut diubah dengan menambahkan tag baru. Selanjutnya, versi kedua diubah dengan mengubah name
bidang. Nilai dalam data
kolom diganti dengan versi final.