mysql - 如何使用子查询更新 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_ARRAY
etc into JSON_MERGE_PATCH
,但它是不正确的。
子查询以“键、值”结构从 table2 返回行。
预期数据:
ID | 数据 |
---|---|
1 | {'key3':'value3','key10':'value10','key13':'value13','key100':'value100'} |
2 | {'key5':'value5','key10':'value10','key13':'value13','key100':'value100'} |
解决方案
像这样的东西:
编辑:我在之前的回答中将 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()
推荐阅读
- java - 在 ListView 的搜索输入中更改默认键盘语言
- python - 训练期间的 Tensorflow NaN 损失:尝试重塑 logits 和标签
- scala - 如何执行保存在文本文件中的spark scala脚本
- python - 在 O(m*log m) 中计算“初始列表”的算法
- javascript - 使用带有大括号和三元运算符的箭头函数来处理 setState 的回调错误?
- laravel-5 - Laravel Eloquent 关于赛程俱乐部数据
- javascript - openlayer intellisense 在 Visual Studio 2017 中不起作用
- linux - 监控 http 连接
- ios - 当我在 DateFormat 上设置 `HH:mm:ss` 时,在极少数情况下会得到 `22:42:31 AM`。`AM` 出乎意料。我该如何解决?
- spring-boot - 如何在 spring-boot 应用程序中登录用户详细信息?