Khi làm việc với JSON trong MariaDB, bạn có thể sử dụng biểu thức JSONPath để thao tác dữ liệu trong tài liệu JSON.
Một tính năng mạnh mẽ mà MariaDB cung cấp là bước ký tự đại diện (**
). Điều này cho phép bạn chọn đệ quy tất cả các phần tử con của phần tử hiện tại.
Bước ký tự đại diện là một phần mở rộng không chuẩn và nó cũng được hỗ trợ với ý nghĩa tương tự trong MySQL.
Ví dụ
Dưới đây là một ví dụ để chứng minh:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Kết quả:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Bước ký tự đại diện đi qua tất cả các đối tượng và chọn các giá trị từ name
của chúng thành viên.
Trong trường hợp này, chúng tôi có thể đạt được kết quả tương tự với một bộ chọn khác. Bộ chọn ký tự đại diện mảng sẽ giúp chúng tôi có được kết quả tương tự:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Kết quả:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Kết quả tương tự.
Tuy nhiên, mọi thứ sẽ thay đổi nếu chúng ta sử dụng một tài liệu khác.
Ví dụ 2
Trong ví dụ sau, chúng tôi nhận được một kết quả khác nhau giữa bước ký tự đại diện và bộ chọn mảng:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Kết quả:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Kết quả khác nhau.
Kết quả rõ ràng sẽ phụ thuộc vào tài liệu và cấu trúc thực tế của biểu thức JSONPath và các bộ chọn được sử dụng sẽ phụ thuộc vào yêu cầu của bạn.
Một điều cần nhớ là bước ký tự đại diện không được là bước cuối cùng trong biểu thức JSONPath. Nó phải được theo sau bởi một bước của bộ chọn thành viên mảng hoặc đối tượng.
Ví dụ 3
Dưới đây là một ví dụ trả về phần tử mảng thứ hai từ tất cả các mảng được gọi là sizes
, bao gồm các mảng được lồng trong các tài liệu khác:
SET @json = '[
{
"_id": 1,
"product": {
"name" : "Tuxedo",
"color" : "Blue",
"sizes": [ "S", "M", "L" ],
"accessories" : {
"belt" : {
"color" : "Navy",
"sizes" : [ "Wide", "Narrow" ]
},
"tie" : {
"color" : "Black",
"sizes" : [ "Short", "Medium", "Long" ]
}
}
}
}
]';
SELECT JSON_EXTRACT(@json, '$**.sizes[1]');
Kết quả:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Mảng dựa trên 0 và vì vậy $**.sizes[1]
đề cập đến phần tử thứ hai trong tất cả các kích thước sizes
mảng.