Trong MariaDB, JSON_REPLACE()
là một hàm tích hợp thay thế các giá trị hiện có trong tài liệu JSON và trả về kết quả.
Cú pháp
Cú pháp như sau:
JSON_REPLACE(json_doc, path, val[, path, val] ...)
Ví dụ
Đây là một ví dụ để chứng minh.
SET @json = '{ "name" : "Wag", "type" : "Cat" }';
SELECT JSON_REPLACE(@json, '$.type', 'Dog');
Kết quả:
+--------------------------------------+ | JSON_REPLACE(@json, '$.type', 'Dog') | +--------------------------------------+ | {"name": "Wag", "type": "Dog"} | +--------------------------------------+
Trong trường hợp này, tôi đã thay thế giá trị Cat
với Dog
.
Phần tử mảng
Để thay thế 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_REPLACE(@json, '$.scores[1]', 7);
Kết quả:
+---------------------------------------+ | JSON_REPLACE(@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 thay thế bằng 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.
Nhiều đường dẫn
Cú pháp cho phép thay thế các giá trị ở nhiều đường dẫn bằng một lệnh gọi tới JSON_REPLACE()
.
Khi cung cấp nhiều đường dẫn, chúng được đánh giá từ trái sang phải. Điều này có nghĩa là kết quả từ lần đánh giá trước đó được sử dụng làm giá trị cho lần tiếp theo.
Đầu tiên, đây là một ví dụ thay thế nhiều giá trị trong một tài liệu, dựa trên khóa của chúng:
SET @json = '
{
"name" : "Flutter",
"type" : "Bird",
"weight" : 10
}
';
SELECT JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20);
Kết quả:
+------------------------------------------------------+ | JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20) | +------------------------------------------------------+ | {"name": "Flutter", "type": "Bat", "weight": 20} | +------------------------------------------------------+
Mỗi giá trị đã được thay thế như mong đợi.
Trong ví dụ tiếp theo, chúng tôi thay thế nhiều phần tử trong một mảng:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REPLACE(
@json,
'$.scores[2]', "a",
'$.scores[4]', "b"
) AS Result;
Kết quả:
+------------------------------------+ | Result | +------------------------------------+ | {"scores": [0, 1, "a", 3, "b", 5]} | +------------------------------------+
Đố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ị value
đối số là null
, sau đó giá trị được thay thế thành null
.
SELECT
JSON_REPLACE(null, '$.a', 1) AS a,
JSON_REPLACE('{"a":1}', null, 1) AS b,
JSON_REPLACE('{"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 tới JSON_REPLACE()
. Điều này dẫn đến NULL
được trả lại cho cả hai cuộc gọi:
SET @json = '{ "name" : "Wag", "type" : "Cat" }';
SELECT
JSON_REPLACE(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_REPLACE(@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_REPLACE()
không có đối số dẫn đến lỗi:
SELECT JSON_REPLACE();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Điều này cũng giống như vậy khi không truyền đủ đối số:
SELECT JSON_REPLACE('{"a":1}');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Các chức năng tương tự
JSON_INSERT()
hàm có thể chèn dữ liệu mới.
JSON_SET()
chức năng có thể chèn dữ liệu mới và cập nhật dữ liệu hiện có. Vì vậy, JSON_SET()
giống như JSON_INSERT()
và JSON_REPLACE()
trong một chức năng.