mysql 更改json数组中的指定对象值
时间: 2023-08-20 16:07:17 浏览: 392
可以使用 MySQL 内置的 JSON 函数来更改 JSON 数组中的指定对象值,具体步骤如下:
1. 使用 JSON_EXTRACT 函数获取指定对象的值;
2. 使用 JSON_REPLACE 函数将获取的值替换成新的值;
3. 使用 JSON_SET 函数将更新后的 JSON 数组重新写回到数据库中。
例如,假设有一个名为 `mytable` 的表,其中有一个名为 `myjson` 的 JSON 类型的列,它的值为一个包含多个对象的数组。现在要将数组中 `id` 为 `1` 的对象的 `name` 字段更新为 `new_name`,可以使用以下 SQL 语句:
```sql
UPDATE mytable SET myjson =
JSON_SET(myjson, CONCAT('$[', JSON_SEARCH(myjson, 'one', '1', NULL, '$[*].id'), '].name'), 'new_name')
WHERE JSON_CONTAINS(myjson, '{"id": 1}', '$[*]');
```
其中,`JSON_SEARCH` 函数用于获取 `id` 为 `1` 的对象在数组中的索引位置,`JSON_SET` 函数用于将获取的索引位置和新的值拼接成 JSON Path,然后更新到原始的 JSON 数组中。`JSON_CONTAINS` 函数用于判断 JSON 数组中是否包含 `id` 为 `1` 的对象。
相关问题
mysql 更改json数组中的指定对象值
可以使用 MySQL 中的 JSON 函数和操作符来更改 JSON 数组中的指定对象值。以下是一个示例:
假设有一个名为 `test` 的表,其中有一个名为 `json_col` 的 JSON 类型的列,其中包含以下 JSON 数组:
```
[
{"id": 1, "name": "Alice", "age": 25},
{"id": 2, "name": "Bob", "age": 30},
{"id": 3, "name": "Charlie", "age": 35}
]
```
现在,要将 `id` 为 2 的对象的 `age` 值更改为 32,可以使用以下 SQL 语句:
```
UPDATE test SET json_col = JSON_SET(json_col, CONCAT('$[', JSON_SEARCH(json_col, 'one', '2', NULL, '$[*].id'), '].age'), 32) WHERE id = 1;
```
解释:
1. `JSON_SEARCH(json_col, 'one', '2', NULL, '$[*].id')` 返回 JSON 数组中 `id` 值为 2 的元素的路径,例如 `"$[1]"`。
2. `CONCAT('$[', JSON_SEARCH(json_col, 'one', '2', NULL, '$[*].id'), '].age')` 用于构建要更新的属性的路径,例如 `"$[1].age"`。
3. `JSON_SET(json_col, CONCAT('$[', JSON_SEARCH(json_col, 'one', '2', NULL, '$[*].id'), '].age'), 32)` 将指定路径的属性值更改为 32。
4. `WHERE id = 1` 用于指定要更新的行。
这样,`id` 为 2 的对象的 `age` 值就被更改为了 32。
json数组里对象指定字段所有值怎么通过MySQL函数更新
假设你有一个名为 `my_table` 的表格,其中包含一个 `json_array` 字段,其中包含多个对象,并且你想要更新其中一个对象的某个字段的所有值。你可以使用 MySQL 的内置函数 `JSON_SET()` 和 `JSON_EXTRACT()` 来完成这个任务。
首先,使用 `JSON_EXTRACT()` 函数来提取需要更新的对象,然后使用 `JSON_SET()` 函数来更新该对象指定字段的所有值。下面是一个示例 SQL 查询,其中更新了 `my_table` 表中 `json_array` 字段中 `id` 为 `1` 的对象的 `name` 字段的所有值为 `new_name`:
```
UPDATE my_table
SET json_array = JSON_SET(json_array, CONCAT('$[', idx, '].name'), 'new_name')
CROSS JOIN (
SELECT idx FROM JSON_TABLE(json_array, '$[*]' COLUMNS (idx FOR ORDINALITY, id INT PATH '$.id')) AS jt
WHERE jt.id = 1
) AS jt
WHERE jt.idx IS NOT NULL;
```
注意,上面的查询使用了 MySQL 8.0 中的 `JSON_TABLE()` 函数和 `CROSS JOIN` 关键字,如果你的 MySQL 版本较低,你可能需要使用其他方式来提取对象的索引值。另外,请根据实际情况修改查询中的表格名和字段名。
阅读全文