从 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 对象的值作为数组的主要内容,如果未能解决你的问题,请参考以下文章

从 Json 数组中提取 JSON 对象到 mysql 8

从 BigQuery 列中提取 Json 值

从 pandas DataFrame 中的列中提取 JSON 数据

如何从 Azure 数据工厂中的 json 对象中提取值

从 Pyspark 中的嵌套 Json-String 列中提取模式

Google BigQuery SQL:从 JSON(列表和数组)中提取数据到列中