Di MySQL, JSON_SEARCH()
fungsi mengembalikan jalur ke string yang diberikan dalam dokumen JSON.
Anda memberikan dokumen JSON sebagai argumen untuk fungsi tersebut. Anda juga memberikan argumen yang menentukan string aktual yang akan dicari (termasuk karakter escape apa pun), serta kata kunci untuk menunjukkan apakah akan mengembalikan jalur semua instance atau hanya satu.
Sintaks
Sintaksnya seperti ini:
JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
Penjelasan masing-masing argumen berikut.
json_doc
adalah dokumen JSON yang akan dicarione_or_all
adalah kata kuncione
atauall
. Jika Anda menggunakanone
, pencarian dihentikan setelah kemunculan pertama ditemukan. Artinya, fungsi hanya mengembalikan jalur instance pertama dari string pencarian. Jikaall
ditentukan, jalur semua kejadian akan ditampilkan sehingga tidak ada jalur duplikat yang disertakan. Jika ada beberapa jalur, jalur tersebut akan dibungkus otomatis sebagai larik.search_str
adalah string sebenarnya untuk mengembalikan jalur.escape_char
adalah karakter opsional untuk digunakan sebagai karakter pelarian. Itu harus berupa konstanta yang kosong atau satu karakter. Jika Anda tidak menentukan argumen ini (atau jika NULL), karakter escape adalah garis miring terbalik (\
).path
adalah argumen opsional untuk menentukan di mana jalur "tingkat atas" dimulai dalam dokumen JSON.
Di dalam search_str
argumen, %
dan _
karakter berfungsi sama seperti saat digunakan dengan LIKE
operator:%
cocok dengan sejumlah karakter (termasuk nol karakter), dan _
cocok dengan tepat satu karakter.
Untuk menentukan %
literal atau _
karakter dalam string pencarian, didahului dengan karakter escape.
Contoh 1 – Penggunaan Dasar
Berikut ini contoh untuk didemonstrasikan.
SELECT JSON_SEARCH('{"Name":"Bart", "Age":10}', 'one', 'Bart') Hasil;
Hasil:
+----------+| Hasil |+----------+| "$.Nama" |+----------+
Contoh 2 – Array
Berikut adalah contoh menemukan string dalam array.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboard", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Mischief') Hasil;Hasil:
+----------------+| Hasil |+----------------+| "$.Hobi[1]" |+----------------+Array menggunakan penomoran berbasis nol, jadi hasil ini menunjukkan elemen kedua.
Contoh 3 – String Tidak Ada
Jika Anda menentukan string yang tidak ada, nilai NULL akan dikembalikan.
SET @doc ='{"Name":"Bart", "Hobi":["Skateboard", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Homer') Hasil;Hasil:
+--------+| Hasil |+--------+| NULL |+--------+Anda juga akan mendapatkan nilai NULL jika salah satu dari
json_doc
,search_str
, ataupath
argumennya adalahNULL
atau jika tidak ada jalur di dalam objek JSON.Contoh 4 – Kemunculan Beberapa String
Jika dokumen JSON berisi beberapa kemunculan string yang sama, hasilnya akan bergantung pada apakah Anda menentukan
one
atauall
sebagai argumen kedua.Jika Anda menggunakan
one
, hanya kemunculan pertama yang ditampilkan (dengan asumsi setidaknya ada satu kemunculan):SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bart') Hasil;Hasil:
+----------+| Hasil |+----------+| "$.Nama" |+----------+Jika Anda menggunakan
all
, jalur semua kejadian dikembalikan. Jika ada lebih dari satu jalur, jalur tersebut akan dibungkus otomatis sebagai larik.SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}';SELECT JSON_SEARCH(@doc, 'all', 'Bart') Hasil;Hasil:
+----------------------------+| Hasil |+----------------------------+| ["$.Name", "$.Friends[0]"] |+-----------------------------+Anda juga dapat menentukan jalur yang hanya mengembalikan hasil tersebut dari jalur yang ditentukan. Selengkapnya di bawah ini (di bawah Contoh 8 – Tentukan Jalur ).
Contoh 5 – Wildcard
Anda dapat menggunakan karakter wildcard seperti yang ditentukan dalam sintaks di atas. Misalnya, Anda dapat menggunakan
%
untuk mencocokkan sejumlah karakter.SET @doc ='{"Name":"Bart", "Hobi":["Skateboard", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Hasil;Hasil:
+----------------+| Hasil |+----------------+| "$.Hobi[0]" |+----------------+Dan Anda dapat menggunakan
_
untuk mencocokkan satu karakter saja.SET @doc ='{"Name":"Bart", "Hobi":["Skateboard", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Hasil;Hasil:
+----------+| Hasil |+----------+| "$.Nama" |+----------+Jika kita menggunakan
_
pada contoh sebelumnya, kita akan mendapatkan hasil NULL.SET @doc ='{"Name":"Bart", "Hobi":["Skateboard", "Mischief"]}';SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Hasil;Hasil:
+--------+| Hasil |+--------+| NULL |+--------+Contoh 6 – Karakter Escape Default
Jika Anda perlu mencari string yang benar-benar berisi salah satu karakter wildcard di atas, Anda harus keluar dari karakter tersebut. Itu memberitahu MySQL untuk menggunakannya sebagai string literal (bukan menafsirkannya sebagai karakter wildcard).
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Hasil;Hasil:
+---------+| Hasil |+---------+| "$.pwd" |+---------+Sekilas, Anda mungkin berpikir bahwa backslash tidak diperlukan, karena bagaimanapun juga, kita akan mendapatkan hasil yang sama jika kita melakukan ini:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Hasil;Hasil:
+---------+| Hasil |+---------+| "$.pwd" |+---------+Tapi masalah dengan pendekatan ini adalah kita juga mendapatkan hasil yang sama jika kita melakukan ini:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%BLAH-BLAH-BLAH-word"}';SELECT JSON_SEARCH(@doc, 'one', 'pass%word' ) 'Hasil';Hasil:
+---------+| Hasil |+---------+| "$.pwd" |+---------+Jadi garis miring terbalik memberi tahu MySQL bahwa kami hanya mencari satu contoh
%
sebagai literal string, dan bukan untuk sejumlah karakter lain.Konsep yang sama berlaku untuk karakter garis bawah.
Jika kita melakukan ini:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Kami mendapatkan ini:
+-------------+-------------+| Lolos | Tidak Lolos |+-------------+-------------+| "$.userid" | "$.userid" |+------------+-------------+Kedua pendekatan mengembalikan hasil yang sama.
Tapi jika kita melakukan ini (ganti _ dengan J di userid):
SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Not Escaped';Kami mendapatkan ini:
+---------+-------------+| Lolos | Tidak Lolos |+---------+-------------+| NULL | "$.userid" |+---------+-------------+Contoh 7 – Karakter Pelarian Kustom
Anda dapat menentukan karakter pelarian Anda sendiri jika diperlukan. Anda melakukan ini dengan memasukkannya sebagai argumen keempat opsional.
Berikut contoh sebelumnya yang ditulis ulang untuk menggunakan karakter escape yang berbeda (userid menyertakan
_
karakter).SET @doc ='{"userid":"bart_simpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Lolos', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Hasil:
+-------------+-------------+| Lolos | Tidak Lolos |+-------------+-------------+| "$.userid" | "$.userid" |+------------+-------------+Dan jika kita mengganti
_
denganJ
di id pengguna:SET @doc ='{"userid":"bartJsimpson", "pwd":"pass%word"}';SELECT JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') ' Lolos', JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';Hasil:
+---------+-------------+| Lolos | Tidak Lolos |+---------+-------------+| NULL | "$.userid" |+---------+-------------+Contoh 8 – Tentukan Jalur
Anda juga dapat menentukan jalur untuk memulai pencarian. Ini contohnya.
SET @data ='{ "Orang":{ "Nama":"Bart", "Usia":10, "Teman":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'all', 'Bart', NULL, '$.Person.Friends') SEBAGAI 'Hasil';Hasil:
+------------------------+| Hasil |+-----------------------+| "$.Person.Friends[0]" |+-----------------------+Jika kami tidak menentukan jalur, kami akan mendapatkan hasil berikut.
SET @data ='{ "Orang":{ "Nama":"Bart", "Usia":10, "Teman":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'semua', 'Bart') SEBAGAI 'Hasil';Hasil:
+------------------------------------------+| Hasil |+------------------------------------------+| ["$.Person.Name", "$.Person.Friends[0]"] |+---------------------------- --------------+Selanjutnya, jika kita telah menentukan
one
sebagai argumen kedua (serta menghilangkan argumen jalur), kita akan mendapatkan yang berikut ini.SET @data ='{ "Orang":{ "Nama":"Bart", "Usia":10, "Teman":["Bart", "Milhouse"] } }';SELECT JSON_SEARCH(@data , 'satu', 'Bart') SEBAGAI 'Hasil';Hasil:
+-----------------+| Hasil |+-----------------+| "$.Person.Name" |+-----------------+Contoh 9 – Dokumen Kosong
Jika dokumen tidak berisi jalur, Anda akan mendapatkan nilai NULL.
SELECT JSON_SEARCH('{}', 'all', 'Bart') 'Result';Hasil:
+--------+| Hasil |+--------+| NULL |+--------+