如何使用子查询更新 json 列?
How do I update a json column with a subquery?
我有 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
,但不正确。
子查询 returns 表 2 中“键、值”结构中的行。
预期数据:
id
data
1
{'key3': 'value3', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'}
2
{'key5': 'value5', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'}
像这样:
编辑:我在之前的回答中将 JSON_OBJECTAGG() 拼错为 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。
我有 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
,但不正确。
子查询 returns 表 2 中“键、值”结构中的行。
预期数据:
id | data |
---|---|
1 | {'key3': 'value3', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'} |
2 | {'key5': 'value5', 'key10': 'value10', 'key13': 'value13', 'key100': 'value100'} |
像这样:
编辑:我在之前的回答中将 JSON_OBJECTAGG() 拼错为 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。