SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

SQLite JSON_EXTRACT()

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencarian Beraksen di sqlite (android)

  2. Cara yang benar untuk menangani Bi directional 1:m di Green-DAO

  3. SQLite NULL

  4. Database SQLite memberikan peringatan indeks otomatis pada <table_name>(kolom) Setelah memutakhirkan Android L

  5. Hitung Jumlah Detik Sejak Tanggal/Waktu Tertentu di SQLite