Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

JSON_SEARCH () - Tìm đường dẫn đến chuỗi trong tài liệu JSON trong MySQL

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óa one hoặc all . Nếu bạn sử dụng one , 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ếu all đượ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ố, %_ 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ới 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 '; 

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 | + -------- + 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách di chuyển Moodle độc ​​lập sang thiết lập có thể mở rộng cơ sở dữ liệu theo cụm

  2. Làm cách nào để tự động tạo di chuyển bằng Sequelize CLI từ các mô hình Sequelize?

  3. Làm cách nào để chèn khung dữ liệu gấu trúc qua mysqldb vào cơ sở dữ liệu?

  4. MySQL INSERT hoặc REPLACE Commands

  5. JSON_UNQUOTE () - Xóa trích dẫn khỏi tài liệu JSON trong MySQL