MariaDB JSON_REPLACE() Function
In MariaDB, JSON_REPLACE() is a built-in function that replaces existing data in a JSON document and returns the new JSON document.
You can use this JSON_INSERT() function to insert new data into a JSON document, use this JSON_SET() function to insert new data into a JSON document, or to update existing data.
MariaDB JSON_REPLACE() Syntax
Here is the syntax for the MariaDB JSON_REPLACE() function:
JSON_REPLACE(json, path, value[, path2, value2] ...)
Parameters
json-
Required. The modified JSON document.
path-
Required. A valid path expression that cannot contain
*or**. value-
Required. new data.
If you supply the wrong number of arguments, MariaDB will report an error: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'.
Return value
The MariaDB JSON_REPLACE() function replaces existing data in a JSON document and return the new JSON document. You can provide multiple pairs of path-value parameters to replace multiple data at once.
The MariaDB JSON_REPLACE() function cans only replace existing data. If the specified path does not exist in the JSON document, no data will be inserted.
If value is a string, the JSON_REPLACE() function will write it to the JSON document as a string.
This function will return NULL if the JSON document or path is NULL.
JSON_REPLACE() Examples
Arrays
Let’s first create a JSON document to demonstrate the following example:
SET @array = '[1, [2, 3]]';
Let’s replace the first and third elements of the array with new values:
SELECT JSON_REPLACE(@array, '$[0]', 0, '$[2]', 6);
Here, we want to replace the first element of the array and the third element of the array. Let’s see the result:
+--------------------------------------------+
| JSON_REPLACE(@array, '$[0]', 0, '$[2]', 6) |
+--------------------------------------------+
| [0, [2, 3]] |
+--------------------------------------------+We found that the first element of the array was successfully replaced 0. Then, there is no insertion at the end of the array 6. This is because the JSON_REPLACE() function only replaces data that already exists.
JSON type data
Let’s first create a JSON document containing JSON objects:
SET @obj = '{"x": 1}';
Now let’s change x the to true:
SELECT JSON_REPLACE(@obj, '$.x', 'true');
Output:
+-----------------------------------+
| JSON_REPLACE(@obj, '$.x', 'true') |
+-----------------------------------+
| {"x": "true"} |
+-----------------------------------+We found out the result is {"x": "true"}, rather than what we hoped for {"x": true}.
This is because, if the value parameter is a string, the JSON_REPLACE() function writes it to the JSON document as a string. Let’s look at a few more similar examples:
SELECT JSON_REPLACE(@obj, '$.x', '[1, 2]');
Output:
+-------------------------------------+
| JSON_REPLACE(@obj, '$.x', '[1, 2]') |
+-------------------------------------+
| {"x": "[1, 2]"} |
+-------------------------------------+or
SELECT JSON_REPLACE(@obj, '$.x', '{"z": 2}');
Output:
+---------------------------------------+
| JSON_REPLACE(@obj, '$.x', '{"z": 2}') |
+---------------------------------------+
| {"x": "{\"z\": 2}"} |
+---------------------------------------+To solve this problem, we can use the JSON_EXTRACT() function to convert the data into JSON type, for example:
SELECT JSON_REPLACE(@obj, '$.x', JSON_EXTRACT('{"z": 2}', '$'));
Output:
+----------------------------------------------------------+
| JSON_REPLACE(@obj, '$.x', JSON_EXTRACT('{"z": 2}', '$')) |
+----------------------------------------------------------+
| {"x": {"z": 2}} |
+----------------------------------------------------------+You can also use JSON_QUERY() or JSON_VALUE().
Conclusion
In MariaDB, JSON_REPLACE() is a built-in function that replaces existing data in a JSON document and returns the new JSON document.