从 MySQL JSON 列中提取 JSON 对象的值作为数组
Posted
技术标签:
【中文标题】从 MySQL JSON 列中提取 JSON 对象的值作为数组【英文标题】:Extract JSON object's values as array from MySQL JSON column 【发布时间】:2019-04-30 04:01:00 【问题描述】:我有一个 json 类型的 mysql 列。在那里,存储了一个类似 JSON 对象的字典。现在,我想从这个 JSON 对象中提取值并创建一个 JSON 数组。
我怎样才能做到这一点?
示例查询
with json_objs(json_col) as (
select CAST('"key1": "value1", "key2": "value2"' AS JSON)
UNION ALL
select CAST('"key3": "value3", "key4": "value4"' AS JSON)
)
select SOME_EXPR_I_CAN_T_FIGURE_OUT from json_objs
预期结果
+----------------------+
| resulting_column |
+----------------------+
| ["value1", "value2"] |
| ["value3", "value4"] |
+----------------------+
(如果需要表 DDL:)
CREATE TABLE `json_objs` (
`json_col` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
【问题讨论】:
mysqlserverteam.com/mysql-8-0-labs-json-aggregation-functions 有帮助吗? 你的键名是不同的还是重复的? 【参考方案1】:您可以在表达式column -> path
中使用->
运算符,如下所示:
create table table1 (
json_dict JSON
);
insert into table1 values('"ak":"av","bk":"bv"');
insert into table1 values('"ak2":"av2","bk2":"bv2"');
select * from table1;
+------------------------------+
| json_dict |
+------------------------------+
| "ak": "av", "bk": "bv" |
| "ak2": "av2", "bk2": "bv2" |
+------------------------------+
2 rows in set (0.00 sec)
select json_dict->"$.*" from table1;
+------------------+
| json_dict->"$.*" |
+------------------+
| ["av", "bv"] |
| ["av2", "bv2"] |
+------------------+
2 rows in set (0.00 sec)
https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#operator_json-column-path
【讨论】:
感谢您的提琴。也 +1 回答:) 节省了跑动【参考方案2】:除了->
运算符,还可以使用Json_Extract()
函数:
架构 (MySQL v8.0)
create table table1 (
json_dict JSON
);
insert into table1 values('"ak":"av","bk":"bv"');
insert into table1 values('"ak2":"av2","bk2":"bv2"');
查询 #1
select JSON_EXTRACT(json_dict, '$.*') from table1;
| JSON_EXTRACT(json_dict, '$.*') |
| ------------------------------ |
| ["av", "bv"] |
| ["av2", "bv2"] |
View on DB Fiddle
【讨论】:
我的速度更快,您从我的答案中复制了代码。但是,我赞成你的,因为你展示了一个稍微不同的选择:) @marekful 感谢您的提琴。我懒得创作小提琴;所以装在你的小提琴上:P以上是关于从 MySQL JSON 列中提取 JSON 对象的值作为数组的主要内容,如果未能解决你的问题,请参考以下文章
从 pandas DataFrame 中的列中提取 JSON 数据