首页 > 解决方案 > 如何使用子查询更新 json 列?

问题描述

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

SELECT id, data 
FROM table1;
ID 数据
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 数据
1 {'key3':'value3','key1':'value1','key2':'value2'}
2 {'key5':'value5','key1':'value1','key2':'value2'}

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

从表2:

ID 钥匙 价值
1 'key10' '价值 10'
2 'key13' '值 13'
3 'key100' '价值100'

我试着用

SELECT key, value FROM table2

with JSON_ARRAYetc into JSON_MERGE_PATCH,但它是不正确的。

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

预期数据:

ID 数据
1 {'key3':'value3','key10':'value10','key13':'value13','key100':'value100'}
2 {'key5':'value5','key10':'value10','key13':'value13','key100':'value100'}

标签: mysqlmysql-json

解决方案


像这样的东西:

编辑:我在之前的回答中将 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"} |
+----+----------------------------------------------------------------------------------+

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


推荐阅读