SQLite json_replace()
fungsi memungkinkan kita untuk mengganti nilai yang ada dalam dokumen JSON dengan nilai lain.
Kami meneruskan JSON asli sebagai argumen pertama saat kami memanggil fungsi, diikuti oleh jalur nilai yang akan diganti, diikuti oleh nilai yang akan diganti.
Kami juga dapat mengganti beberapa pasangan kunci/nilai jika diperlukan.
Sintaks
Ini bekerja seperti ini:
json_replace(json, path1, value1, path2, value2...)
Dimana json
mewakili JSON asli, dan path1, value1, path2, value2...
adalah pasangan jalur/nilai yang harus diganti.
Contoh
Berikut adalah contoh dasar untuk ditunjukkan:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
Hasil:
{"name":"Baldy"}
Di sini, saya memperbarui nilai name
kunci dari Fluffy
ke Baldy
.
Kami dapat memperbarui beberapa pasangan kunci/nilai seperti ini:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
Hasil:
{"name":"Baldy","age":11}
Saya hanya menambahkan lebih banyak argumen kunci/nilai ketika saya memanggil json_replace()
.
Di sini, saya menggunakan jeda baris untuk membuat kode lebih mudah dibaca. Bisa saja semuanya dalam satu baris – hasilnya akan sama.
Bagaimana jika Kunci Tidak Ada?
Jika kunci belum ada di JSON, tidak ada yang diganti:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
Hasil:
{"name":"Fluffy"}
Inilah ciri utama yang membedakan json_replace()
fungsi dari json_set()
dan json_insert()
fungsi. Fungsi-fungsi tersebut akan memasukkan nilai jika kuncinya belum ada.
Namun, dimungkinkan untuk menyisipkan kunci baru secara efektif dengan json_replace()
dengan mengganti seluruh objek/dokumen JSON. Contoh di bawah.
Ganti Seluruh Dokumen JSON
Kita dapat menggunakan json_replace()
untuk mengganti seluruh dokumen JSON dengan yang lain:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
Hasil:
{"name":"Baldy"}
Jadi ini memungkinkan kita untuk secara efektif memasukkan kunci baru ke dalam dokumen:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
Hasil:
{"name":"Baldy","age":11}
Sebenarnya, kami tidak memasukkan kunci baru apa pun. Kami hanya mengganti seluruh dokumen. Tetapi hasilnya adalah dokumen JSON yang berisi kunci yang tidak ada di dokumen aslinya.
Ganti Objek Tersemat
Kami juga dapat mengganti objek yang disematkan:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
Hasil:
{"a":1,"b":{"c":2}}
Ketika saya melakukan ini, saya menggunakan json()
fungsi untuk mengembalikan argumen saya sebagai string JSON. Inilah yang terjadi jika saya tidak melakukannya:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
Hasil:
{"a":1,"b":"{ \"c\" : 2 }"}
Dokumen JSON disisipkan sebagai nilai teks alih-alih objek JSON, dan oleh karena itu tanda kutip ganda diloloskan dengan garis miring terbalik.
Namun, kami tidak bisa begitu saja menghapus tanda kutip tunggal, karena ini menghasilkan kesalahan:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
Hasil:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
Tanpa tanda kutip tunggal atau json()
fungsi, kami mendapatkan kesalahan segera setelah menemukan kurung kurawal kiri. Oleh karena itu kita perlu menggunakan tanda kutip tunggal atau json()
fungsi, bergantung pada apakah kita memasukkan objek JSON atau nilai string/teks SQL.
Cara lain untuk menyisipkan objek JSON adalah dengan menggunakan json_object()
fungsi alih-alih json()
fungsi:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
Hasil:
{"a":1,"b":{"c":2}}
Ganti Array
Konsep yang sama berlaku dengan array:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
Hasil:
{"a":[5,6,7]}
Jika kita menghapus json()
fungsi, kita mendapatkan ini:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
Hasil:
{"a":"[ 5, 6, 7 ]"}
Dan jika kita menghapus tanda kutip tunggal, kita mendapatkan kesalahan:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
Hasil:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
Sebagai alternatif, kita dapat menggunakan json_array()
fungsi alih-alih json()
. Fungsi tersebut memungkinkan Anda membuat array berdasarkan argumennya:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
Hasil:
{"a":[5,6,7]}
Menambahkan Nilai ke akhir Array
Untuk menambahkan nilai ke akhir array, kita dapat menggunakan json_insert()
atau json_set()
fungsi.
Namun, jika kita harus menggunakan json_replace()
, kita dapat mengganti seluruh larik dengan larik lain yang memiliki nilai ekstra yang ditambahkan ke akhir larik:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
Hasil:
[1,2,3,4]
Tapi seperti yang disebutkan, json_insert()
dan json_set()
memungkinkan Anda untuk benar-benar menambahkan nilai ke array tanpa mengganti seluruh array.
Ganti Elemen Array
Berikut ini contoh penggunaan json_replace()
untuk mengganti elemen dalam array:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
Hasil:
[1,4,3]
Array berbasis nol, jadi [1]
menunjukkan item larik kedua.
json_set()
fungsi juga dapat digunakan untuk menggantikan elemen yang ada. Namun, json_insert()
fungsi tidak memungkinkan kita untuk mengganti elemen yang ada.
Jalur Tidak Valid
Kami akan mendapatkan kesalahan jika jalur kami tidak terbentuk dengan baik:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
Hasil:
Runtime error: JSON path error near 'a'
Dalam hal ini, saya lupa memasukkan $.
di depan jalan.
Dokumen JSON Tidak Valid
Kami juga akan mendapatkan kesalahan JSON tidak terbentuk dengan baik:
SELECT json_replace('{ "a" : 1', '$.a', 2);
Hasil:
Runtime error: malformed JSON
Kali ini kesalahan memberi tahu kami bahwa JSON kami salah format.