Di MariaDB, JSON_SEARCH()
adalah fungsi bawaan yang memungkinkan Anda mendapatkan jalur ke nilai tertentu dalam dokumen JSON.
Ia menerima dokumen JSON dan string sebagai argumen, dan mengembalikan jalur ke string yang diberikan di dalam dokumen.
Sintaks
Sintaksnya seperti ini:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Dimana:
json_doc
adalah dokumen JSON dansearch_str
adalah string.return_arg
adalah kata kuncione
atauall
. Jika Anda menggunakanone
, hanya jalur pertama yang dikembalikan. Kejadian lain diabaikan. Jalur mana yang dianggap "pertama" tidak ditentukan (menurut dokumentasi MariaDB). Jikaall
ditentukan, jalur semua kejadian dikembalikan. Jika ada beberapa jalur, jalur tersebut akan dibungkus otomatis sebagai larik.escape_char
argumen adalah karakter opsional untuk digunakan sebagai karakter pelarian.path
argumen adalah argumen opsional untuk menentukan di mana jalur "tingkat atas" dimulai dalam dokumen JSON.
Contoh
Berikut ini contoh untuk didemonstrasikan:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Hasil:
+----------------------------------+| JSON_SEARCH(@json, 'one', 'Wag') |+----------------------------------+ | "$.name" |+----------------------------------+
Berikut ini contoh mengembalikan jalur untuk elemen dalam array:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Hasil:
+-------------------------------------+| JSON_SEARCH(@json, 'satu', "Sedang") |+----------------------------------- --+| "$.sizes[1]" |+-------------------------------------+Array berbasis nol, jadi
$.sizes[1]
mengacu pada elemen kedua dalam array.Beberapa Kejadian
Jika Anda ingin mengembalikan semua jalur yang berisi string, gunakan
all
bukannyaone
untuk argumen kedua.SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'all', 'Dog');
Hasil:
+----------------------------------+| JSON_SEARCH(@json, 'semua', "Anjing") |+----------------------------------+ | ["$[0].type", "$[1].type"] |+----------------------------- -----+Jika kita mengubah
all
keone
, inilah yang terjadi:SET @json = '[ { "name": "Wag", "type": "Dog", "weight": 20 }, { "name": "Bark", "type": "Dog", "weight": 10 }, { "name": "Meow", "type": "Cat", "weight": 7 } ]'; SELECT JSON_SEARCH(@json, 'one', 'Dog');
Hasil:
+----------------------------------+| JSON_SEARCH(@json, 'satu', "Anjing") |+----------------------------------+ | "$[0].type" |+----------------------------------+Hanya satu jalur yang dikembalikan.
Tentukan Jalur
Berikut adalah contoh yang menentukan jalur yang akan ditelusuri dalam dokumen:
SET @json = ' { "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "NZ Dog Award" : "Top Dog", "New York Marathon" : "Fastest Animal", "Sumo 2021" : "Biggest Dog" } } } '; SELECT JSON_SEARCH( @json, 'all', '%dog%', NULL, '$.details.awards' ) AS Result;
Hasil:
+------------------------------------------------- -------------------+| Hasil |+----------------------------------------------- ------------------+| ["$.details.awards.NZ Dog Award", "$.details.awards.Sumo 2021"] |+------------------------ -----------------------------------------+Dalam hal ini, string
dog
sebenarnya terjadi tiga kali dalam dokumen, tetapi hanya dua kali di bawah jalur yang ditentukan.Juga, kami menggunakan
NULL
untuk argumen karakter escape, yang menghasilkan karakter escape default yang digunakan, yaitu garis miring terbalik (\
).Karakter Escape Default
Secara default, karakter escape adalah garis miring terbalik (
\
).Contoh:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my\%pwd') AS "Escaped";
Hasil:
+--------------------------------------+------- -----+| Tidak Lolos | Kabur |+----------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------+- -----------+Tanda persentase (
%
) adalah karakter wildcard yang cocok dengan sejumlah karakter. Oleh karena itu, jika kita tidak menghindarinya, maka akan cocok dengan sejumlah karakter, termasuk karakter yang bukan tanda persentase.Tetapi ketika kita lolos dari tanda persentase dengan karakter melarikan diri, itu hanya akan cocok ketika ada tepat satu tanda persentase di lokasi itu.
Hasil di atas mencerminkan hal ini.
Tentukan Karakter Escape Kustom
Anda dapat menentukan karakter escape khusus jika diperlukan. Untuk melakukan ini, berikan sebagai argumen keempat.
Contoh:
SET @json = '[ { "uid": "Wag", "pwd": "my%pwd" }, { "uid": "Bark", "pwd": "my%%%pwd" }, { "uid": "Bark", "pwd": "myBIGpwd" } ]'; SELECT JSON_SEARCH(@json, 'all', 'my%pwd', '!') AS "Not Escaped", JSON_SEARCH(@json, 'all', 'my!%pwd', '!') AS "Escaped";
Hasil:
+--------------------------------------+------- -----+| Tidak Lolos | Kabur |+----------------------------------+-------- ----+| ["$[0].pwd", "$[1].pwd", "$[2].pwd"] | "$[0].pwd" |+---------------------------------------+- -----------+Jadi kita mendapatkan hasil yang sama seperti pada contoh sebelumnya. Satu-satunya perbedaan adalah bahwa kami menentukan karakter pelarian yang berbeda. Dalam hal ini, kami menetapkan bahwa tanda seru (
!
) adalah karakter pelarian.Argumen Null
Jika salah satu string pencarian, string pencarian, atau argumen jalur adalah
NULL
, hasilnya adalahNULL
:SELECT JSON_SEARCH(null, 'all', 's', '', '$') AS a, JSON_SEARCH('{"a":1}', 'all', null, '', '$') AS b, JSON_SEARCH('{"a":1}', 'all', 's', '', null) AS c;
Hasil:
+------+------+------+| sebuah | b | c |+------+------+------+| NULL | NULL | NULL |+------+------+------+Jumlah Parameter Salah
Tidak memberikan argumen akan menyebabkan kesalahan:
SELECT JSON_SEARCH();
Hasil:
ERROR 1582 (42000):Jumlah parameter salah dalam panggilan ke fungsi asli 'JSON_SEARCH'Sama halnya jika Anda memberikan argumen yang terlalu sedikit:
SELECT JSON_SEARCH('{"a":1}', 'all');
Hasil:
ERROR 1582 (42000):Jumlah parameter salah dalam panggilan ke fungsi asli 'JSON_SEARCH'