MariaDB bao gồm hai bộ chọn cho phép chúng tôi chọn các phần tử từ mảng JSON:
-
[N]
chọn số phần tử N trong mảng (ví dụ:[0]
để chọn phần tử đầu tiên). -
[*]
chọn tất cả các phần tử trong mảng.
Chúng có thể được sử dụng trong một số hàm JSON có trong MariaDB. Các ví dụ sau sử dụng chúng với JSON_EXTRACT()
để trả về các phần tử mảng đã chọn.
Ví dụ - [N]
Dưới đây là một ví dụ đơn giản để minh họa cách chọn một phần tử mảng đơn lẻ:
SELECT JSON_EXTRACT('[1,2,3]', '$[1]');
Kết quả:
+---------------------------------+ | JSON_EXTRACT('[1,2,3]', '$[1]') | +---------------------------------+ | 2 | +---------------------------------+
Mảng dựa trên 0 và vì vậy $[1]
chọn phần tử mảng thứ hai.
Đây là một ví dụ khác, lần này sử dụng tài liệu JSON lớn hơn một chút:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[1]');
Kết quả:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[1]') | +-----------------------------------+ | "M" | +-----------------------------------+
Trong trường hợp này, .sizes
chỉ định các kích thước sizes
thành viên đối tượng, và vì vậy $.sizes[1]
chọn mục thứ hai trong các kích thước sizes
mảng.
Ví dụ- [*]
[*]
bộ chọn chọn tất cả các phần tử trong mảng.
Ví dụ:
SET @json = '
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
}
';
SELECT JSON_EXTRACT(@json, '$.sizes[*]');
Kết quả:
+-----------------------------------+ | JSON_EXTRACT(@json, '$.sizes[*]') | +-----------------------------------+ | ["S", "M", "L"] | +-----------------------------------+
Trong trường hợp này, kết quả trông giống hệt như mảng ban đầu, trong trường hợp đó, nó có thể được trả về chỉ bằng cách chỉ định $.sizes
.
Nhiều bộ chọn mảng
Nhưng đây là một ví dụ khác sử dụng hai bộ chọn mảng.
Đầu tiên, chúng tôi sử dụng bộ chọn ký tự đại diện để chọn tất cả các phần tử trong mảng. Sau đó, chúng tôi sử dụng một bộ chọn mảng khác để chỉ chọn phần tử thứ hai trong một mảng được lồng trong các phần tử đó:
SET @json = '
{
"products" :
[
{
"_id": 1,
"product": "Left Handed Screwdriver",
"sizes": [ "S", "M", "L" ]
},
{
"_id": 2,
"product": "Long Weight",
"sizes": [ 8, 7, 10 ]
},
{
"_id": 3,
"product": "Bottomless Coffee Cup",
"sizes": [ "Tall", "Grande", "Venti" ]
}
]
}
';
SELECT JSON_EXTRACT(@json, '$.products[*].sizes[1]');
Kết quả:
+-----------------------------------------------+ | JSON_EXTRACT(@json, '$.products[*].sizes[1]') | +-----------------------------------------------+ | ["M", 7, "Grande"] | +-----------------------------------------------+
Bước ký tự đại diện
Nếu tài liệu JSON của bạn chứa nhiều mảng có cùng tên, một số mảng được lồng ở các cấp khác nhau hoặc trong đối tượng riêng của chúng, bạn có thể chọn tất cả chúng với sự trợ giúp của bước ký tự đại diện (**
). Bước ký tự đại diện chọn đệ quy tất cả các phần tử con của phần tử hiện tại.
Ở đây, chúng tôi sử dụng nó để giúp xây dựng biểu thức JSONPath 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"] | +-------------------------------------+