【问题标题】:How do I update a json column with a subquery?如何使用子查询更新 json 列?
【发布时间】:2021-10-25 15:41:16
【问题描述】:

我有 MySQL 5.7 和带有 json 列数据的 table1。

SELECT id, data 
FROM table1;
id data
1 {'key3': 'value3'}
2 {'key5': 'value5'}

我可以使用:

UPDATE `table1` as `t1`
SET `t1`.`data` =  JSON_MERGE_PATCH(`t1`.`data`, JSON_OBJECT('key1', 'value1', 'key2', 'value2'));

我会得到:

id data
1 {'key3': 'value3', 'key1': 'value1', 'key2': 'value2'}
2 {'key5': 'value5', 'key1': 'value1', 'key2': 'value2'}

如何从子查询中获取数据并使用它生成JSON_MERGE_PATCH

来自表 2:

id key value
1 'key10' 'value10'
2 'key13' 'value13'
3 'key100' 'value100'

我尝试使用

SELECT key, value FROM table2

JSON_ARRAY等改成JSON_MERGE_PATCH,但是不正确。

子查询以“键、值”结构返回 table2 中的行。

预期数据:

id data
1 {'key3': 'value3', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'}
2 {'key5': 'value5', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'}

【问题讨论】:

  • 您的预期结果是什么?
  • 我在帖子中添加了预期的数据

标签: mysql mysql-json


【解决方案1】:

类似这样的:

编辑:我在之前的回答中将 JSON_OBJECT_AGG() 拼错为 JSON_OBJECT_AGG()。我已将其修复为 JSON_OBJECTAGG():

UPDATE `table1` as `t1`
SET `t1`.`data` =  JSON_MERGE_PATCH(`t1`.`data`, 
    (SELECT JSON_OBJECTAGG(`key`, value) FROM table2));

在 MySQL 5.7.34 中测试。请注意,您必须在反引号中分隔列名称 key,因为它是保留关键字。

运行更新后的结果:

mysql> select * from table1;
+----+----------------------------------------------------------------------------------+
| id | data                                                                             |
+----+----------------------------------------------------------------------------------+
|  1 | {"key3": "value3", "key10": "value10", "key13": "value13", "key100": "value100"} |
|  2 | {"key5": "value5", "key10": "value10", "key13": "value13", "key100": "value100"} |
+----+----------------------------------------------------------------------------------+

有关JSON_OBJECT_AGG() 函数的详细信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_json-objectagg

【讨论】:

  • JSON_OBJECTAGG() 在 MySQL 5.7.22 中添加。你在使用亚马逊极光吗?在添加 JSON_OBJECTAGG() 之前,它们从 MySQL 5.7 分叉。
  • 很接近了,是的,谢谢。正确的方法是使用 GROUP BY 和 JSON_OBJECTAGG() UPDATE table1 as t1 SET t1.data = JSON_MERGE_PATCH(t1.data, ( SELECT JSON_OBJECTAGG(key, ) 来自table2 分组id));
  • 在我的真实案例中,我有更多的列,并且在 SELECT JSON_OBJECTAGG 之后有一些行。它已由 GROUP_BY 或 WHERE 修复。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2022-01-04
相关资源
最近更新 更多