Dalam SQLite, json_extract()
fungsi mengekstrak dan mengembalikan satu atau beberapa nilai dari JSON yang terbentuk dengan baik.
Kami meneruskan JSON sebagai argumen saat kami memanggil fungsi, dan itu mengembalikan nilai yang berlaku/s.
Kita dapat menentukan satu atau beberapa jalur untuk mengekstrak dari dokumen JSON.
Sintaks
Sintaksnya seperti ini:
json_extract(X,P1,P2,...)
Dimana X
mewakili dokumen JSON, dan P1,P2,...
adalah jalur yang dapat kita gunakan untuk mengekstrak bagian tertentu dari dokumen JSON.
Contoh
Berikut adalah contoh dasar untuk ditunjukkan:
SELECT json_extract('{ "a" : 1 }', '$');
Hasil:
{"a":1}
Di sini, saya menentukan jalur $
, yang mengembalikan seluruh dokumen JSON.
Berikut ini contoh dengan dokumen JSON yang lebih besar:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$'
);
Hasil:
{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}
Mari kita ubah jalurnya sehingga kita hanya mengembalikan dogs
susunan:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs'
);
Hasil:
[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]
Mari kita pilih salah satu elemen dalam array:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Hasil:
{"name":"Bark","scores":[3,4,8,7]}
Array berbasis nol, sehingga penghitungan dimulai dari 0
. Oleh karena itu, kami menetapkan [1]
untuk mendapatkan elemen kedua dalam dogs
array, yang kebetulan merupakan objek JSON.
Mari kita masuk lebih dalam lagi, dan kembalikan hanya nama anjing pada posisi itu dalam larik:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
);
Hasil:
Bark
Tentukan Beberapa Jalur
json_extract()
fungsi memungkinkan kita untuk memilih beberapa jalur:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);
Hasil:
["Wag","Bark","Woof"]
Dalam hal ini, saya mengembalikan nama semua anjing di dogs
larik.
Semua nama anjing dikembalikan dalam array.
Memilih Jalur yang Tidak Ada
Jika kita menunjuk ke jalur yang tidak ada, null
dikembalikan.
Pertama, mari kita atur .nullvalue
ke NULL
:
.nullvalue NULL
.nullvalue
perintah dot memungkinkan kita untuk memberikan string yang akan digunakan untuk menggantikan nilai null. Ini adalah salah satu dari beberapa cara Anda dapat mengganti nilai null dengan string di SQLite. Dalam hal ini, saya mengaturnya ke NULL
. Sekarang, nilai nol apa pun akan mengembalikan NULL
bukannya hasil kosong.
Sekarang mari kita panggil json_extract()
, tetapi gunakan argumen kedua yang menunjuk ke jalur yang tidak ada:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.cats'
);
Hasil:
NULL
Jalur Tidak Valid
Kami akan mendapatkan kesalahan jika jalur kami tidak terbentuk dengan baik:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'dogs'
);
Hasil:
Runtime error: JSON path error near 'dogs'
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_extract('{ "Dogs" : }',
'$'
);
Hasil:
Runtime error: malformed JSON
Kali ini kesalahan memberi tahu kami bahwa JSON kami salah format.
Jenis Pengembalian
Dokumentasi SQLite menyatakan sebagai berikut:
Jika hanya satu jalur P1 yang disediakan, maka tipe data SQL dari hasilnya adalah NULL untuk JSON null, INTEGER atau REAL untuk nilai numerik JSON, INTEGER nol untuk nilai salah JSON, INTEGER untuk nilai JSON yang sebenarnya, teks yang dikutip untuk nilai string JSON, dan representasi teks untuk objek JSON dan nilai array. Jika ada beberapa argumen jalur (P1, P2, dan seterusnya) maka rutin ini mengembalikan teks SQLite yang merupakan larik JSON yang dibentuk dengan baik yang menyimpan berbagai nilai.
Kompatibilitas MySQL
Dokumentasi SQLite juga memperingatkan kita tentang ketidakcocokan halus antara implementasi SQLite dan MySQL dari json_extract()
fungsi.
Secara khusus, ini menyatakan:
Versi MySQL dari json_extract() selalu mengembalikan JSON. Versi SQLite dari json_extract() hanya mengembalikan JSON jika ada dua atau lebih argumen PATH (karena hasilnya adalah larik JSON) atau jika argumen PATH tunggal mereferensikan larik atau objek. Dalam SQLite, jika json_extract() hanya memiliki satu argumen PATH dan PATH tersebut mereferensikan null JSON atau string atau nilai numerik, maka json_extract() mengembalikan nilai SQL NULL, TEXT, INTEGER, atau REAL yang sesuai.
Pada dasarnya, perbedaan ini hanya terlihat saat mengakses nilai individual dalam JSON yang berupa string atau NULL.