Trong MariaDB, JSON_SEARCH()
là một hàm tích hợp cho phép bạn lấy đường dẫn đến một giá trị nhất định trong tài liệu JSON.
Nó chấp nhận tài liệu JSON và một chuỗi làm đối số và trả về đường dẫn đến chuỗi đã cho trong tài liệu.
Cú pháp
Cú pháp như sau:
JSON_SEARCH(
json_doc,
return_arg,
search_str[, escape_char[, path] ...]
)
Ở đâu:
-
json_doc
là tài liệu JSON vàsearch_str
là chuỗi. -
return_arg
là từ khóaone
hoặcall
. Nếu bạn sử dụngone
, chỉ có đường dẫn đầu tiên được trả về. Mọi lần xuất hiện khác đều bị bỏ qua. Đường dẫn nào được coi là “đầu tiên” là không xác định (theo tài liệu MariaDB). Nếuall
được chỉ định, đường dẫn của tất cả các lần xuất hiện được trả về. Nếu có nhiều đường dẫn, chúng sẽ tự động được bao bọc dưới dạng một mảng. -
escape_char
đối số là một ký tự tùy chọn để sử dụng làm ký tự thoát. -
path
đối số là đối số tùy chọn để xác định vị trí bắt đầu đường dẫn "cấp cao nhất" trong tài liệu JSON.
Ví dụ
Dưới đây là một ví dụ để chứng minh:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}';
SELECT JSON_SEARCH(@json, 'one', 'Wag');
Kết quả:
+ ---------------------------------- + | JSON_SEARCH (@json, 'one', 'Wag') | + ---------------------------------- + | "$ .name" | + ---------------------------------- +
Dưới đây là một ví dụ về việc trả về đường dẫn cho một phần tử trong một mảng:
SET @json = '
{
"product" : "Left Handed Screwdriver",
"sizes" : [ "Small", "Medium", "Large" ],
}';
SELECT JSON_SEARCH(@json, 'one', 'Medium');
Kết quả:
+ ------------------------------------- + | JSON_SEARCH (@json, 'one', "Medium") | + ----------------------------------- - + | "$ .sizes [1]" | + ------------------------------------- +Mảng dựa trên 0 và vì vậy
$.sizes[1]
tham chiếu đến phần tử thứ hai trong mảng.Nhiều lần xuất hiện
Nếu bạn muốn trả về tất cả các đường dẫn có chứa chuỗi, hãy sử dụng
all
thay vìone
cho đối số thứ hai.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');
Kết quả:
+ ---------------------------------- + | JSON_SEARCH (@json, 'all', "Dog") | + ---------------------------------- + | ["$ [0] .type", "$ [1] .type"] | + ----------------------------- ----- +Nếu chúng tôi thay đổi
all
thànhone
, đây là những gì sẽ xảy ra: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');
Kết quả:
+ ---------------------------------- + | JSON_SEARCH (@json, 'one', "Dog") | + ---------------------------------- + | "$ [0] .type" | + ---------------------------------- +Chỉ có một con đường được trả lại.
Chỉ định một đường dẫn
Dưới đây là một ví dụ chỉ định một đường dẫn để tìm kiếm trong tài liệu:
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;
Kết quả:
+ ---------------------------------------------- ------------------- + | Kết quả | + ----------------------------------------------- ------------------ + | ["$ .details.awards.NZ Dog Award", "$ .details.awards.Sumo 2021"] | + ------------------------ ----------------------------------------- +Trong trường hợp này, chuỗi
dog
thực sự xảy ra ba lần trong tài liệu, nhưng chỉ hai lần bên dưới đường dẫn được chỉ định.Ngoài ra, chúng tôi đã sử dụng
NULL
cho đối số ký tự thoát, dẫn đến ký tự thoát mặc định được sử dụng, là dấu gạch chéo ngược (\
).Ký tự thoát mặc định
Theo mặc định, ký tự thoát là một dấu gạch chéo ngược (
\
).Ví dụ:
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";
Kết quả:
+ -------------------------------------- + ------- ----- + | Không trốn thoát | Đã trốn thoát | + -------------------------------------- + -------- ---- + | ["$ [0] .pwd", "$ [1] .pwd", "$ [2] .pwd"] | "$ [0] .pwd" | + -------------------------------------- + - ----------- +Dấu phần trăm (
%
) là một ký tự đại diện khớp với bất kỳ số ký tự nào. Do đó, nếu chúng tôi không thoát khỏi nó, thì nó sẽ khớp với bất kỳ số ký tự nào, kể cả những ký tự không phải là dấu phần trăm.Nhưng khi chúng ta thoát khỏi dấu phần trăm với ký tự thoát, nó sẽ chỉ khớp khi có chính xác một dấu phần trăm ở vị trí đó.
Kết quả trên phản ánh điều này.
Chỉ định một ký tự thoát tùy chỉnh
Bạn có thể chỉ định một ký tự thoát tùy chỉnh nếu được yêu cầu. Để làm điều này, hãy cung cấp nó làm đối số thứ tư.
Ví dụ:
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";
Kết quả:
+ -------------------------------------- + ------- ----- + | Không trốn thoát | Đã trốn thoát | + -------------------------------------- + -------- ---- + | ["$ [0] .pwd", "$ [1] .pwd", "$ [2] .pwd"] | "$ [0] .pwd" | + -------------------------------------- + - ----------- +Vì vậy, chúng tôi nhận được kết quả tương tự như trong ví dụ trước. Sự khác biệt duy nhất là chúng tôi đã chỉ định một ký tự thoát khác. Trong trường hợp này, chúng tôi chỉ định rằng dấu chấm than (
!
) là ký tự thoát.Đối số rỗng
Nếu bất kỳ đối số chuỗi tìm kiếm, chuỗi tìm kiếm hoặc đường dẫn nào là
NULL
, kết quả làNULL
: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;
Kết quả:
+ ------ + ------ + ------ + | a | b | c | + ------ + ------ + ------ + | NULL | NULL | KHÔNG | + ------ + ------ + ------ +Đếm tham số không chính xác
Không cung cấp đối số dẫn đến lỗi:
SELECT JSON_SEARCH();
Kết quả:
LỖI 1582 (42000):Số lượng tham số không chính xác trong lệnh gọi hàm gốc 'JSON_SEARCH'Điều này cũng xảy ra tương tự khi bạn cung cấp quá ít đối số:
SELECT JSON_SEARCH('{"a":1}', 'all');
Kết quả:
ERROR 1582 (42000):Số lượng tham số không chính xác trong lệnh gọi hàm gốc 'JSON_SEARCH'