Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

JSON_SEARCH() – Temukan Path ke String dalam Dokumen JSON di MySQL

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 dicari
  • one_or_all adalah kata kunci one atau all . Jika Anda menggunakan one , pencarian dihentikan setelah kemunculan pertama ditemukan. Artinya, fungsi hanya mengembalikan jalur instance pertama dari string pencarian. Jika all 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 , atau path argumennya adalah NULL 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 atau all 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 _ dengan J 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 |+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengakses server jarak jauh dengan klien phpMyAdmin lokal?

  2. Cara Mengedit File MySQL my.cnf

  3. Bagaimana cara mengembalikan kolom integer dan numerik dari MySQL sebagai integer dan numerik di PHP?

  4. Pengantar Failover untuk Replikasi MySQL - Blog 101

  5. Buat Diagram Basis Data Secara Otomatis MySQL