Trong MySQL, JSON_SEARCH()
hàm trả về đường dẫn đến một chuỗi đã cho trong tài liệu JSON.
Bạn cung cấp tài liệu JSON làm đối số cho hàm. Bạn cũng cung cấp đối số xác định chuỗi thực tế để tìm kiếm (bao gồm bất kỳ ký tự thoát nào), cũng như một từ khóa để cho biết liệu trả về đường dẫn của tất cả các trường hợp hay chỉ một.
Cú pháp
Cú pháp như sau:
JSON_SEARCH (json_doc, one_or_all, search_str [, Escape_char [, path] ...])
Sau đây là giải thích cho từng đối số.
-
json_doc
là tài liệu JSON để tìm kiếm -
one_or_all
là từ khóaone
hoặcall
. Nếu bạn sử dụngone
, việc tìm kiếm sẽ bị dừng lại khi lần xuất hiện đầu tiên được tìm thấy. Tức là, hàm chỉ trả về đường dẫn của phiên bản đầu tiên của chuỗi tìm kiếm. Nếuall
được chỉ định, đường dẫn của tất cả các lần xuất hiện được trả về sao cho không có đường dẫn trùng lặp nào được đưa vào. 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. -
search_str
là chuỗi thực tế để trả về đường dẫn của. -
escape_char
là một ký tự tùy chọn để sử dụng như một ký tự thoát. Nó phải là một hằng số trống hoặc một ký tự. Nếu bạn không chỉ định đối số này (hoặc nếu nó là NULL), thì ký tự thoát là dấu gạch chéo ngược (\
). -
path
là một đối số tùy chọn để xác định vị trí bắt đầu của đường dẫn "cấp cao nhất" trong tài liệu JSON.
Trong search_str
đối số, %
và _
các ký tự hoạt động giống như khi được sử dụng với LIKE
toán tử:%
khớp với bất kỳ số ký tự nào (bao gồm cả 0 ký tự) và _
khớp chính xác một ký tự.
Để chỉ định một chữ %
hoặc _
trong chuỗi tìm kiếm, đặt trước nó bằng ký tự thoát.
Ví dụ 1 - Cách sử dụng cơ bản
Đây là một ví dụ để chứng minh.
SELECT JSON_SEARCH ('{"Name":"Bart", "Age":10}', 'one', 'Bart') Kết quả;
Kết quả:
+ ---------- + | Kết quả | + ---------- + | "$ .Name" | + ---------- +
Ví dụ 2 - Mảng
Dưới đây là một ví dụ về cách tìm một chuỗi trong một mảng.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}'; CHỌN JSON_SEARCH (@doc, 'one', 'Mischief') Kết quả;
Kết quả:
+ ---------------- + | Kết quả | + ---------------- + | "$ .Hobbies [1]" | + ---------------- +
Mảng sử dụng cách đánh số dựa trên 0, vì vậy kết quả này chỉ ra phần tử thứ hai.
Ví dụ 3 - Chuỗi không tồn tại
Nếu bạn chỉ định một chuỗi không tồn tại, giá trị NULL sẽ được trả về.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}'; CHỌN JSON_SEARCH (@doc, 'one', 'Homer') Kết quả;
Kết quả:
+ -------- + | Kết quả | + -------- + | NULL | + -------- +
Bạn cũng sẽ nhận được giá trị NULL nếu bất kỳ json_doc
nào , search_str
hoặc path
đối số là NULL
hoặc nếu không có đường dẫn nào tồn tại trong đối tượng JSON.
Ví dụ 4 - Nhiều lần xuất hiện của một chuỗi
Nếu tài liệu JSON chứa nhiều lần xuất hiện của cùng một chuỗi, kết quả sẽ phụ thuộc vào việc bạn có chỉ định one
hay không hoặc all
như đối số thứ hai.
Nếu bạn sử dụng one
, chỉ lần xuất hiện đầu tiên được trả về (giả sử có ít nhất một lần xuất hiện):
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}'; SELECT JSON_SEARCH (@doc, 'one', 'Bart') Kết quả;
Kết quả:
+ ---------- + | Kết quả | + ---------- + | "$ .Name" | + ---------- +
Nếu bạn sử dụng all
, đường dẫn của tất cả các lần xuất hiện đều được trả về. Nếu có nhiều hơn một đường dẫn, chúng sẽ tự động được bao bọc dưới dạng một mảng.
SET @doc ='{"Name":"Bart", "Friends":["Bart", "Milhouse"]}'; SELECT JSON_SEARCH (@doc, 'all', 'Bart') Kết quả;
Kết quả:
+ ---------------------------- + | Kết quả | + ---------------------------- + | ["$ .Name", "$ .Friends [0]"] | + ---------------------------- +
Bạn cũng có thể chỉ định một đường dẫn chỉ trả về những kết quả đó từ một đường dẫn được chỉ định. Thông tin thêm về điều đó bên dưới (trong Ví dụ 8 - Chỉ định một đường dẫn ).
Ví dụ 5 - Ký tự đại diện
Bạn có thể sử dụng các ký tự đại diện như được chỉ định trong cú pháp ở trên. Ví dụ:bạn có thể sử dụng %
để khớp với bất kỳ số ký tự nào.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}'; SELECT JSON_SEARCH (@doc, 'one', 'Skate%') Kết quả;
Kết quả:
+ ---------------- + | Kết quả | + ---------------- + | "$ .Hobbies [0]" | + ---------------- +
Và bạn có thể sử dụng _
để khớp với một ký tự duy nhất.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}'; SELECT JSON_SEARCH (@doc, 'one', 'Bar_') Kết quả;
Kết quả:
+ ---------- + | Kết quả | + ---------- + | "$ .Name" | + ---------- +
Nếu chúng tôi sử dụng _
trong ví dụ trước, chúng tôi sẽ nhận được kết quả NULL.
SET @doc ='{"Name":"Bart", "Hobbies":["Skateboarding", "Mischief"]}'; SELECT JSON_SEARCH (@doc, 'one', 'Skate_') Kết quả;
Kết quả:
+ -------- + | Kết quả | + -------- + | NULL | + -------- +
Ví dụ 6 - Ký tự thoát mặc định
Nếu bạn cần tìm kiếm một chuỗi thực sự chứa bất kỳ ký tự đại diện nào ở trên, bạn cần phải thoát khỏi ký tự đó. Điều đó yêu cầu MySQL sử dụng nó như một chuỗi ký tự (thay vì hiểu nó như một ký tự đại diện).
SET @doc ='{"userid":"bart_simpson", "pwd":"pass% word"}'; SELECT JSON_SEARCH (@doc, 'one', 'pass \% word') Kết quả;Kết quả:
+ --------- + | Kết quả | + --------- + | "$ .pwd" | + --------- +Thoạt nhìn, bạn có thể nghĩ rằng dấu gạch chéo ngược là không cần thiết, bởi vì sau tất cả, chúng ta sẽ nhận được kết quả tương tự nếu chúng ta làm điều này:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass% word"}'; SELECT JSON_SEARCH (@doc, 'one', 'pass% word') Kết quả;Kết quả:
+ --------- + | Kết quả | + --------- + | "$ .pwd" | + --------- +Nhưng vấn đề với cách tiếp cận này là chúng ta cũng nhận được kết quả tương tự nếu chúng ta làm điều này:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass% BLAH-BLAH-BLAH-word"}'; CHỌN JSON_SEARCH (@doc, 'one', 'pass% word' ) 'Kết quả';Kết quả:
+ --------- + | Kết quả | + --------- + | "$ .pwd" | + --------- +Vì vậy, dấu gạch chéo ngược thông báo cho MySQL rằng chúng tôi chỉ đang tìm kiếm một phiên bản duy nhất của
%
dưới dạng một chuỗi ký tự, và không phải cho bất kỳ số lượng ký tự nào khác.Khái niệm tương tự cũng đúng đối với ký tự gạch dưới.
Nếu chúng tôi làm điều này:
SET @doc ='{"userid":"bart_simpson", "pwd":"pass% word"}'; CHỌN JSON_SEARCH (@doc, 'one', 'bart \ _simpson') 'Thoát', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Không thoát';Chúng tôi nhận được điều này:
+ ------------ + ------------- + | Bỏ trốn | Không thoát | + ------------ + ------------- + | "$ .userid" | "$ .userid" | + ------------ + ------------- +Cả hai phương pháp đều trả về cùng một kết quả.
Nhưng nếu chúng ta làm điều này (thay thế _ bằng J trong userid):
SET @doc ='{"userid":"bartJsimpson", "pwd":"pass% word"}'; CHỌN JSON_SEARCH (@doc, 'one', 'bart \ _simpson') 'Thoát', JSON_SEARCH (@doc, 'one', 'bart_simpson') 'Không thoát';Chúng tôi nhận được điều này:
+ --------- + ------------- + | Bỏ trốn | Không thoát | + --------- + ------------- + | NULL | "$ .userid" | + --------- + ------------- +Ví dụ 7 - Ký tự thoát tùy chỉnh
Bạn có thể chỉ định ký tự thoát của riêng mình nếu được yêu cầu. Bạn thực hiện việc này bằng cách đưa nó vào làm đối số thứ tư tùy chọn.
Đây là ví dụ trước được viết lại để sử dụng một ký tự thoát khác (userid bao gồm
_
ký tự).SET @doc ='{"userid":"bart_simpson", "pwd":"pass% word"}'; CHỌN JSON_SEARCH (@doc, 'one', 'bart $ _simpson', '$') ' Đã thoát ', JSON_SEARCH (@doc,' one ',' bart_simpson ')' Không thoát ';Kết quả:
+ ------------ + ------------- + | Bỏ trốn | Không thoát | + ------------ + ------------- + | "$ .userid" | "$ .userid" | + ------------ + ------------- +Và nếu chúng ta thay thế
_
vớiJ
trong userid:SET @doc ='{"userid":"bartJsimpson", "pwd":"pass% word"}'; CHỌN JSON_SEARCH (@doc, 'one', 'bart $ _simpson', '$') ' Đã thoát ', JSON_SEARCH (@doc,' one ',' bart_simpson ')' Không thoát ';Kết quả:
+ --------- + ------------- + | Bỏ trốn | Không thoát | + --------- + ------------- + | NULL | "$ .userid" | + --------- + ------------- +Ví dụ 8 - Chỉ định một đường dẫn
Bạn cũng có thể chỉ định một đường dẫn để bắt đầu tìm kiếm từ đó. Đây là một ví dụ.
SET @data ='{"Person":{"Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"]}}'; CHỌN JSON_SEARCH (@data , 'all', 'Bart', NULL, '$ .Person.Friends') NHƯ 'Kết quả';Kết quả:
+ ----------------------- + | Kết quả | + ----------------------- + | "$ .Person.Friends [0]" | + ----------------------- +Nếu chúng tôi không chỉ định một đường dẫn, chúng tôi sẽ nhận được kết quả sau.
SET @data ='{"Person":{"Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"]}}'; CHỌN JSON_SEARCH (@data , 'all', 'Bart') NHƯ 'Kết quả';Kết quả:
+ ------------------------------------------ + | Kết quả | + ------------------------------------------ + | ["$ .Person.Name", "$ .Person.Friends [0]"] | + ---------------------------- -------------- +Hơn nữa, nếu chúng tôi đã chỉ định
one
là đối số thứ hai (cũng như bỏ qua đối số đường dẫn), chúng tôi sẽ kết thúc với phần sau.SET @data ='{"Person":{"Name":"Bart", "Age":10, "Friends":["Bart", "Milhouse"]}}'; CHỌN JSON_SEARCH (@data , 'một', 'Bart') NHƯ 'Kết quả';Kết quả:
+ ----------------- + | Kết quả | + ----------------- + | "$ .Person.Name" | + ----------------- +Ví dụ 9 - Tài liệu trống
Nếu tài liệu không chứa đường dẫn, bạn sẽ nhận được giá trị NULL.
SELECT JSON_SEARCH ('{}', 'all', 'Bart') 'Kết quả';Kết quả:
+ -------- + | Kết quả | + -------- + | NULL | + -------- +