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

MariaDB JSON_SEARCH () Giải thích

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óa one hoặc all . Nếu bạn sử dụng one , 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ếu all đượ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ành one , đâ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' 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di chuyển từ MySQL Enterprise sang MariaDB 10.3

  2. Xử lý các vấn đề sao chép từ các cụm cơ sở dữ liệu MariaDB không phải GTID sang GTID MariaDB

  3. Cách SUBTIME () hoạt động trong MariaDB

  4. Cách SLEEP () hoạt động trong MariaDB

  5. Tổng kết năm 2018:7 cột mốc quan trọng của MariaDB mà bạn có thể đã bỏ lỡ