Pada dasarnya Anda bermaksud menerapkan seleksi dan proyeksi ke elemen array dan bidang objek dari dokumen JSON Anda. Anda perlu melakukan sesuatu seperti klausa WHERE untuk memilih "baris" di dalam array, dan kemudian melakukan sesuatu seperti memilih salah satu bidang (bukan yang Anda gunakan dalam kriteria pilihan Anda).
Ini dilakukan dalam SQL menggunakan klausa WHERE dan daftar kolom SELECT, tetapi melakukan hal yang sama dengan JSON bukanlah sesuatu yang dapat Anda lakukan dengan mudah dengan fungsi seperti JSON_SEARCH() dan JSON_CONTAINS().
Solusi yang disediakan MySQL 8.0 adalah JSON_TABLE() berfungsi untuk mengubah dokumen JSON menjadi tabel turunan virtual — seolah-olah Anda telah mendefinisikan baris dan kolom konvensional. Ini berfungsi jika JSON dalam format yang Anda gambarkan, array objek.
Berikut demo yang saya lakukan dengan memasukkan data contoh Anda ke dalam tabel:
create table mytable ( mycol json );
insert into mytable set mycol = '[{"Race": "Orc", "strength": 14}, {"Race": "Knight", "strength": 7}]';
SELECT j.* FROM mytable, JSON_TABLE(mycol,
'$[*]' COLUMNS (
race VARCHAR(10) PATH '$.Race',
strength INT PATH '$.strength'
)
) AS j;
+--------+----------+
| race | strength |
+--------+----------+
| Orc | 14 |
| Knight | 7 |
+--------+----------+
Sekarang Anda dapat melakukan hal-hal yang biasa Anda lakukan dengan kueri SELECT, seperti pemilihan dan proyeksi:
SELECT j.strength FROM mytable, JSON_TABLE(mycol, '$[*]'
COLUMNS (
race VARCHAR(10) PATH '$.Race',
strength INT PATH '$.strength'
)
) AS j
WHERE j.race = 'Orc'
+----------+
| strength |
+----------+
| 14 |
+----------+
Ini memiliki beberapa masalah:
-
Anda perlu melakukan ini setiap saat Anda meminta data JSON, atau buat VIEW untuk melakukannya.
-
Anda mengatakan bahwa Anda tidak mengetahui bidang atribut, tetapi untuk menulis kueri JSON_TABLE(), Anda harus menentukan atribut yang ingin Anda telusuri dan proyeksikan dalam kueri Anda. Anda tidak dapat menggunakan ini untuk data yang sama sekali tidak ditentukan.
Saya telah menjawab cukup banyak pertanyaan serupa tentang penggunaan JSON di MySQL. Saya telah mengamati bahwa ketika Anda ingin melakukan hal semacam ini, memperlakukan dokumen JSON seperti tabel sehingga Anda dapat menerapkan kondisi dalam klausa WHERE ke bidang dalam data JSON Anda, maka semua kueri Anda menjadi jauh lebih sulit. Kemudian Anda mulai merasa lebih baik menghabiskan beberapa menit untuk mendefinisikan atribut Anda sehingga Anda dapat menulis kueri yang lebih sederhana.