Trong MariaDB, JSON_INSERT()
là một hàm tích hợp để chèn dữ liệu vào tài liệu JSON và trả về kết quả.
Cú pháp
Cú pháp như sau:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Ở đâu json_doc
là tài liệu JSON, path
là đường dẫn nơi dữ liệu sẽ được chèn và val
là giá trị được chèn tại đường dẫn đó.
Ví dụ
Đây là một ví dụ để chứng minh.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog");
Kết quả:
+----------------------------------------------+ | JSON_INSERT(@json_document, '$.type', "Dog") | +----------------------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------------------+
Ở đây tôi đã chèn "type": "Dog"
vào tài liệu.
Trong trường hợp này, tôi đã sử dụng $.type
như đường dẫn. Do đó, type
là chìa khóa và Dog
là giá trị.
Khi đường dẫn đã tồn tại
Việc chuyển một đường dẫn đã tồn tại trong tài liệu JSON dẫn đến tài liệu gốc được trả về không thay đổi.
Ví dụ:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");
Kết quả:
+-----------------------------------------------+ | JSON_INSERT(@json_document, '$.name', "Bark") | +-----------------------------------------------+ | {"name": "Wag"} | +-----------------------------------------------+
Chèn mảng
Dưới đây là một ví dụ về chèn một mảng vào tài liệu JSON:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');
Kết quả:
+--------------------------------------------------------+ | JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') | +--------------------------------------------------------+ | {"name": "Wag", "scores": "[ 8, 7, 9 ]"} | +--------------------------------------------------------+
Nối vào Mảng
Đây là một ví dụ về việc sử dụng JSON_INSERT()
để nối dữ liệu vào một mảng:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");
Kết quả:
+--------------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") | +--------------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} | +--------------------------------------------------------------+
Tuy nhiên, mặc dù nó hoạt động tốt cho ví dụ này, nó có thể dễ dàng bị lỗi. Ví dụ:nếu chúng tôi cố gắng chèn giá trị vào một vị trí khác trong mảng, nó không hoạt động:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");
Kết quả:
+-----------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") | +-----------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog"]} | +-----------------------------------------------------------+
Để chèn các giá trị vào một mảng, hãy sử dụng JSON_ARRAY_INSERT()
chức năng thay thế.
Ngoài ra, mặc dù chúng tôi có thể nối một giá trị vào một mảng trong ví dụ trên, nhưng có lẽ bạn nên sử dụng JSON_ARRAY_APPEND()
vì nó được thiết kế đặc biệt cho mục đích đó.
Đối tượng lồng nhau
Dưới đây là một ví dụ về việc chèn một giá trị vào 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"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
);
Kết quả:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"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ể sử dụng JSON_DETAILED()
để làm cho kết quả dễ đọc hơn:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
);
Kết quả:
{ "_id": 1, "name": "Wag", "details": { "type": "Dog", "weight": 20, "awards": { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } } }
Đối số rỗng
Nếu một trong hai json_document
hoặc path
đối số là NULL
, kết quả là NULL
:
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog');
Kết quả:
+------------------------------------+-------------------------------------+ | JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') | +------------------------------------+-------------------------------------+ | NULL | NULL | +------------------------------------+-------------------------------------+
Tuy nhiên, nếu giá trị value
đối số là NULL
, khóa được thêm vào đường dẫn được chỉ định, với giá trị null
:
SELECT JSON_INSERT('{"a":1}', '$.type', null);
Kết quả:
+----------------------------------------+ | JSON_INSERT('{"a":1}', '$.type', null) | +----------------------------------------+ | {"a": 1, "type": null} | +----------------------------------------+
Đếm tham số không chính xác
Không cung cấp đối số dẫn đến lỗi:
SELECT JSON_INSERT();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Đ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_INSERT('{ "a": 1}');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Các chức năng tương tự
JSON_REPLACE()
chức năng có thể cập nhật dữ liệu hiện có.
JSON_SET()
chức năng có thể cập nhật dữ liệu hiện có và chèn dữ liệu mới. Vì vậy, JSON_SET()
giống như JSON_INSERT()
và JSON_REPLACE()
trong một chức năng.