Trong MariaDB, JSON_SET()
là một chức năng được tích hợp sẵn để cập nhật hoặc chèn dữ liệu vào tài liệu JSON và trả về kết quả.
JSON_SET()
có thể cập nhật và chèn dữ liệu, trong khi JSON_INSERT()
chỉ có thể chèn dữ liệu và JSON_REPLACE()
chỉ có thể cập nhật dữ liệu.
Cú pháp
Cú pháp như sau:
JSON_SET(json_doc, path, val[, path, val] ...)
Ở đâu:
-
json_doc
là tài liệu JSON. -
path
là đường dẫn của phần tử để chèn dữ liệu hoặc cập nhật giá trị tại đó. -
val
là giá trị mới.
Ví dụ
Đây là một ví dụ để chứng minh.
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT JSON_SET(@json, '$.type', 'Dog');
Kết quả:
+----------------------------------+ | JSON_SET(@json, '$.type', 'Dog') | +----------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------+
Trong trường hợp này, tôi đã cập nhật giá trị của loại type
thành viên Cat
thành Dog
.
Phần tử mảng
Để cập nhật hoặc chèn một phần tử mảng, hãy chỉ định chỉ mục của phần tử:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[1]', 7);
Kết quả:
+--------------------------------------+ | JSON_SET(@json, '$.scores[1]', 7) | +--------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +--------------------------------------+
Trong trường hợp này, phần tử mảng thứ hai đã được cập nhật với giá trị mới. Mảng dựa trên 0 và vì vậy $.scores[1]
tham chiếu đến phần tử thứ hai trong mảng.
Chèn dữ liệu
Các ví dụ trước đã cập nhật dữ liệu hiện có. Dưới đây là một ví dụ về cách chèn dữ liệu mới:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}
';
SELECT JSON_SET(@json, '$.weight', 10);
Kết quả:
+----------------------------------------------+ | JSON_SET(@json, '$.weight', 10) | +----------------------------------------------+ | {"name": "Wag", "type": "Dog", "weight": 10} | +----------------------------------------------+
Tại đây, chúng tôi đã chèn một cặp khóa / giá trị mới ("weight": 10
).
Dưới đây là một ví dụ về việc thêm một phần tử mới vào một mảng:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[3]', 7);
Kết quả:
+-----------------------------------------+ | JSON_SET(@json, '$.scores[3]', 7) | +-----------------------------------------+ | {"name": "Wag", "scores": [8, 0, 9, 7]} | +-----------------------------------------+
Ví dụ về mảng này cũng có thể được thực hiện với JSON_ARRAY_INSERT()
hoặc JSON_ARRAY_APPEND()
.
Nhiều đường dẫn
Cú pháp cho phép cài đặt / cập nhật giá trị ở nhiều đường dẫn chỉ với một lệnh gọi tới JSON_SET()
.
Ví dụ:
SET @json = '
{
"name" : "Scratch",
"type" : "Rat"
}
';
SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);
Kết quả:
+--------------------------------------------------+ | JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) | +--------------------------------------------------+ | {"name": "Scratch", "type": "Cat", "weight": 10} | +--------------------------------------------------+
Trong ví dụ tiếp theo, chúng tôi chèn một giá trị mới vào một mảng và cập nhật một giá trị khác:
SET @json = '{ "scores" : [ 0, 1, 2 ] }';
SELECT
JSON_SET(
@json,
'$.scores[1]', "a",
'$.scores[3]', "b"
) AS Result;
Kết quả:
+------------------------------+ | Result | +------------------------------+ | {"scores": [0, "a", 2, "b"]} | +------------------------------+
Đối số rỗng
Nếu json_doc
hoặc bất kỳ path
đối số là null
, kết quả là NULL
. Nhưng nếu giá trị type
đối số là null
, sau đó giá trị được thay thế thành null
.
SELECT
JSON_SET(null, '$.a', 1) AS a,
JSON_SET('{"a":1}', null, 1) AS b,
JSON_SET('{"a":1}', '$.a', null) AS c;
Kết quả:
+------+------+-------------+ | a | b | c | +------+------+-------------+ | NULL | NULL | {"a": null} | +------+------+-------------+
Trong ví dụ sau, một trong các đối số đường dẫn bị thiếu trong mỗi lệnh gọi đến JSON_SET()
. Trong cả hai trường hợp, kết quả là NULL
:
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT
JSON_SET(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_SET(@json, '$.name', 'Bark', null, 'Dog') AS b;
Kết quả:
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Đếm tham số không chính xác
Đang gọi JSON_SET()
không có đối số dẫn đến lỗi:
SELECT JSON_SET();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'
Điều này cũng tương tự khi không truyền đủ đối số:
SELECT JSON_SET('{"a":1}');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'