以下情况将报错
-
json_doc不合法
-
path 不合法
-
包含* 或者 ** 通配符
-
键值对采用自左到右的顺序进行追加。追加一对键值后的新值将成为下一对键值追加的目标。
-
如果指定目录下为标量或者对象值,则会被封装为数组,然后将新的值加入到数组中。对于不包含任何值得键值对将直接忽略。
mysql> SET @j = '["a", ["b", "c"], "d"]';
-
语法:
JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
-
更新一个JSON文本,向文本中插入一个数组,然后返回修改后的文本。如果参数为NULL,则返回NULL。
-
以下情况报错
-
json_doc参数不合法
-
path不合法
-
包含 * 或者 ** 通配符
-
不是以数组标示结尾
-
键值对采用自左到右的顺序进行插入,插入一对后的新值将作为下一对插入的目标。
-
对于不包含任何值得键值对将直接忽略。如果path指定的是一个数组元素,则其对应的值将插入到该元素右边的任意位置;如果path指定的是数组的末尾,则其值将插入到该数组末尾。
-
执行插入操作后,其元素位置将发生变化,也将影响后续插入数据的位置定义。如最后的示例中,第二个插入数据并未出现数数据库中,是因为第一次插入操作后,原语句中定义的位置在新数据中未找到指定的元素,从而被忽略。
mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';
较早的修改会影响数组中以下元素的位置,因此同一
JSON_ARRAY_INSERT()
调用中的后续路径 应考虑到这一点。在最后一个示例中,第二个路径不插入任何内容,因为路径在第一次插入后不再匹配任何内容。
JSON_INSERT(json_doc, path, val[, path, val] ...)
将数据插入JSON文档并返回结果。NULL如果有任何参数,则 返回NULL。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。
路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。
将忽略文档中现有路径的路径值对,并且不会覆盖现有文档值。如果路径标识以下类型的值之一,则文档中不存在路径的路径值对会将值添加到文档中:
不存在于现有对象中的成员。该成员将添加到对象并与新值关联。
位于现有数组末尾的位置。该数组使用新值进行扩展。如果现有值不是数组,则将其作为数组自动包装,然后使用新值进行扩展。
为了进行比较
JSON_INSERT()
,
JSON_REPLACE()
以及
JSON_SET()
,看到的讨论
JSON_SET()
。
否则,将忽略文档中不存在路径的路径 - 值对,但不起作用。
mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
执行 符合
RFC 7396
的两个或多个JSON文档的合并,并返回合并的结果,而不保留具有重复键的成员。如果至少有一个作为参数传递给此函数的文档无效,则引发错误。
有关此函数与之间差异的解释和示例JSON_MERGE_PRESERVE(),请参阅与
JSON_MERGE_PRESERVE()相比较的JSON_MERGE_PATCH()
。
JSON_MERGE_PATCH() 执行合并如下:
如果第一个参数不是对象,则合并的结果与将空对象与第二个参数合并的结果相同。
如果第二个参数不是对象,则合并的结果是第二个参数。
如果两个参数都是对象,则合并的结果是具有以下成员的对象:
第一个对象的所有成员没有在第二个对象中具有相同键的相应成员。
第二个对象的所有成员在第一个对象中没有对应的键,其值不是JSON null文字。
具有在第一个和第二个对象中存在的键的所有成员,并且其在第二个对象中的值不是JSON null 文字。这些成员的值是以递归方式将第一个对象中的值与第二个对象中的值合并的结果。
JSON_MERGE_PATCH() MySQL 5.7.22及更高版本支持。
JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE()进行比较。 的行为JSON_MERGE_PATCH()是一样的是
JSON_MERGE_PRESERVE()
,有以下两种情况例外:
JSON_MERGE_PATCH()使用第二个对象中的匹配键删除第一个对象中的任何成员,前提是与第二个对象中的键关联的值不是JSON null。
如果第二个对象的成员具有与第一个对象中的成员匹配的键,则将第一个对象中 的值JSON_MERGE_PATCH() 替换为第二个对象中的值,而 JSON_MERGE_PRESERVE() 将第二个值附加到第一个值。
此示例比较了将相同的3个JSON对象(每个对象具有匹配的密钥"a")与这两个函数中的每一个进行合并的结果:
mysql> SET @x = '{ "a": 1, "b": 2 }',
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
合并两个或多个JSON文档并返回合并的结果。NULL如果有任何参数,则 返回NULL。如果任何参数不是有效的JSON文档,则会发生错误。
合并根据以下规则进行。有关其他信息,请参阅
JSON值的规范化,合并和自动包装
。
相邻阵列合并为单个阵列。
相邻对象合并为单个对象。
标量值作为数组自动包装并合并为数组。
通过将对象自动包装为数组并合并两个数组来合并相邻的数组和对象
mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]');
这个函数在MySQL 5.7.22中作为同义词添加
JSON_MERGE()
。该 JSON_MERGE()函数现已弃用,并且将在MySQL的未来版本中删除。
该功能与
JSON_MERGE_PATCH()
重要方面类似但不同 ; 有关详细信息,请参阅
JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE()
进行比较。
JSON_REMOVE(json_doc, path[, path] ...)
从JSON文档中删除数据并返回结果。NULL如果有任何参数,则 返回NULL。如果json_doc参数不是有效的JSON文档或任何path参数不是有效的路径表达式或者是$或包含*或** 通配符,则会发生错误 。
该path参数进行评估从左到右。通过评估一条路径生成的文档将成为评估下一条路径的新值。
如果文档中不存在要删除的元素,则不是错误; 在这种情况下,路径不会影响文档。
mysql> SET @j = '["a", ["b", "c"], "d"]';
JSON_REPLACE(json_doc, path, val[, path, val] ...)
替换JSON文档中的现有值并返回结果。NULL如果有任何参数,则 返回NULL。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。
路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。
文档中现有路径的路径值对使用新值覆盖现有文档值。文档中不存在路径的路径 - 值对将被忽略,并且不起作用。
为了进行比较
JSON_INSERT()
,
JSON_REPLACE()
以及
JSON_SET()
,看到的讨论
JSON_SET()
mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
JSON_SET(json_doc, path, val[, path, val] ...)
在JSON文档中插入或更新数据并返回结果。返回NULL如果任何参数是 NULL或path,如果给,不定位的对象。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。
路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。
文档中现有路径的路径值对使用新值覆盖现有文档值。如果路径标识以下类型的值之一,则文档中不存在路径的路径值对会将值添加到文档中:
不存在于现有对象中的成员。该成员将添加到对象并与新值关联。
位于现有数组末尾的位置。该数组使用新值进行扩展。如果现有值不是数组,则将其作为数组自动包装,然后使用新值进行扩展。