MariaDB JSON_SET() Function
In MariaDB, JSON_SET() is a built-in function that inserts or updates data in a JSON document and returns the new JSON document.
JSON_SET() is equivalent to a combination of JSON_INSERT() and JSON_REPLACE(). JSON_INSERT() can only insert data, and JSON_REPLACE() can only update data.
MariaDB JSON_SET() Syntax
Here is the syntax for the MariaDB JSON_SET() function:
JSON_SET(json, path, value[, path2, value2] ...)
Parameters
json-
Required. The modified JSON document.
path-
Required. A valid path expression that cannot contain
*or**. value-
Required. The data to set.
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_SET'.
Return value
The MariaDB JSON_SET() function inserts or update data in a JSON document and return the new JSON document. You can provide multiple pairs of path-value parameters to set multiple data at once.
If the path specified in the parameter exists in the JSON document, update the value matching the path; if not, insert data on the corresponding path.
If value is a string, the JSON_SET() function will write it to the JSON document as a string.
This function will return NULL if the JSON document or path is NULL.
MariaDB JSON_SET() Examples
Let’s first create a JSON document containing JSON objects:
SET @obj = '{"x": 1}';
Now let’s set some data:
SELECT JSON_SET(@obj, '$.x', '10', '$.y', '[1, 2]');
Output:
+----------------------------------------------+
| JSON_SET(@obj, '$.x', '10', '$.y', '[1, 2]') |
+----------------------------------------------+
| {"x": "10", "y": "[1, 2]"} |
+----------------------------------------------+We found that although the operation have been successful, there are still a small problem, that is, the array [1, 2] becomes "[1, 2]".
This is because, if the value parameter is a string, the JSON_SET() function writes it to the JSON document as a string. Let’s look at another similar example:
SELECT JSON_SET(@obj, '$.x', '10', '$.y', '{"z": 2}');
Output:
+------------------------------------------------+
| JSON_SET(@obj, '$.x', '10', '$.y', '{"z": 2}') |
+------------------------------------------------+
| {"x": "10", "y": "{\"z\": 2}"} |
+------------------------------------------------+To solve this problem, we can use the JSON_EXTRACT() function to convert the data into JSON type, for example:
SELECT JSON_SET(@obj, '$.x', '10', '$.y', JSON_EXTRACT('[1, 2]', '$'));
Output:
+-----------------------------------------------------------------+
| JSON_SET(@obj, '$.x', '10', '$.y', JSON_EXTRACT('[1, 2]', '$')) |
+-----------------------------------------------------------------+
| {"x": "10", "y": [1, 2]} |
+-----------------------------------------------------------------+You can also use JSON_QUERY() or JSON_VALUE().
Conclusion
In MariaDB, JSON_SET() is a built-in function that inserts or updates data in a JSON document and returns the new JSON document.