Trong MariaDB, JSON_EXTRACT()
là một chức năng tích hợp để trích xuất dữ liệu từ tài liệu JSON, dựa trên một hoặc các đường dẫn nhất định.
Nó có thể trả về giá trị đơn và nhiều giá trị. Nếu một giá trị duy nhất được so khớp, thì một giá trị duy nhất sẽ được trả về. Nếu nhiều giá trị được so khớp, thì những giá trị đó được trả về trong một mảng.
Cú pháp
Cú pháp như sau:
JSON_EXTRACT(json_doc, path[, path] ...)
Ở đâu json_doc
là tài liệu JSON và mỗi path
đối số là một đường dẫn trong tài liệu.
Ví dụ
Đây là một ví dụ để chứng minh.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Kết quả:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Nhiều đường dẫn
Dưới đây là một ví dụ về việc chỉ định nhiều đường dẫn để trả về nhiều giá trị từ tài liệu JSON.
Khi bạn trả về nhiều giá trị, chúng sẽ được trả về trong một mảng.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Kết quả:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Đường dẫn không tồn tại
Chuyển một đường dẫn không tồn tại trong tài liệu JSON dẫn đến NULL
.
Ví dụ:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Kết quả:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Tuy nhiên, nếu nhiều đường dẫn được chuyển qua và ít nhất một trong số chúng khớp với nhau, thì giá trị khớp sẽ được trích xuất và trả về trong một mảng. Điều này đúng ngay cả khi chỉ một giá trị được trích xuất.
Ví dụ:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Kết quả:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Mảng
Dưới đây là một ví dụ về trích xuất dữ liệu từ một mảng:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Kết quả:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Mảng dựa trên 0 và vì vậy $.awards[0]
trích yếu tố đầu tiên của awards
mảng.
Đối tượng lồng nhau
Dưới đây là một ví dụ về trích xuất dữ liệu từ một đối tượng được lồng bên trong một đối tượng khác:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards.New York Marathon'
) AS Result;
Kết quả:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Tuy nhiên, nếu chúng tôi muốn trích xuất tất cả các giải thưởng, chúng tôi có thể rút ngắn đường dẫn đến $.details.awards
:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards'
) AS Result;
Kết quả:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Kiểm tra trước kết quả
Chúng tôi có thể làm cho kết quả dễ đọc hơn bằng cách chuyển JSON_EXTRACT()
vào JSON_DETAILED()
chức năng:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_EXTRACT(
@json_document,
'$.details.awards'
)
) AS Result;
Kết quả:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Đối số rỗng
Nếu bất kỳ đối số nào là NULL
, kết quả là NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Kết quả:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Đếm tham số không chính xác
Không cung cấp đối số dẫn đến lỗi:
SELECT JSON_EXTRACT();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Điều này cũng xảy ra tương tự khi bạn cung cấp quá ít hoặc quá nhiều đối số:
SELECT JSON_EXTRACT('{ "a": 1}');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'