MySQL JSON列提取JSON对象的值为数组

MySQL JSON列提取JSON对象的值为数组

在本文中,我们将介绍MySQL中如何提取JSON列中JSON对象的值为数组。JSON(JavaScript Object Notation)数据格式在最近几年中已经广泛地使用在互联网应用程序中。而MySQL 5.7和更新版本提供了内置的JSON数据类型,它们可以通过JSON函数从JSON格式中访问或提取数据。当我们需要从MySQL JSON列中获取JSON对象的值为一个数组时,可以使用JSON函数来实现。

阅读更多:MySQL 教程

1. 什么是MySQL JSON类型

MySQL 5.7.8与2013年发布后,开始支持JSON类型。MySQL内置的JSON数据类型可以存储和处理JSON数据。JSON类型是按照JavaScript对象表示法进行处理的,内部会使用引擎特定的存储格式来优化查询效率。可以使用如下SQL语句在MySQL中创建一个JSON类型的列:

CREATE TABLE `people` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `info` json DEFAULT NULL,
  PRIMARY KEY (`id`)
);

2. JSON_EXTRACT和JSON_ARRAY函数

在MySQL中,可以使用JSON_EXTRACT函数来提取JSON对象中指定的值。JSON_EXTRACT函数的语法如下:

JSON_EXTRACT(json_doc, path[, path] ...)

其中,json_doc是存储JSON数据的列或表达式,path参数是一个或多个JSON对象的键名,可以使用类似$.key的语法来提取嵌套JSON对象中的值。

JSON_ARRAY函数能够创建一个JSON数组,它的语法如下:

JSON_ARRAY([value[,value]...])

value参数可以使任何可被转换为JSON的MySQL数据类型。JSON_ARRAY函数返回一个JSON数组。

3. 将MySQL JSON对象值提取为数组

下面我们来看一下如何将MySQL JSON列中的JSON对象的值提取为数组。假设我们有如下的表people:

+----+----------+-------------------------------------+
| id | name     | info                                |
+----+----------+-------------------------------------+
| 1  | John Doe | {"age":30,"email":"johndoe@test.com"}|
| 2  | Jane Doe | {"age":25,"email":"janedoe@test.com"}|
+----+----------+-------------------------------------+

现在我们需要从people表中的info列中提取email的值为一个数组。可以使用以下SQL查询语句实现:

SELECT 
    JSON_EXTRACT(info, '$.email') as email
FROM 
    people;

输出的结果如下所示:

+----------------------+
| email                |
+----------------------+
| "johndoe@test.com"   |
| "janedoe@test.com"   |
+----------------------+

我们可以看到,上面的查询结果返回了人员的email地址。但是这些email值并不是一个数组。为了将email的值返回为一个数组,可以改为以下的SQL查询语句:

SELECT 
    JSON_ARRAY(
        JSON_EXTRACT(info, '$.email')
    ) as emails
FROM 
    people;

输出的结果如下所示:

+------------------------+
| emails                 |
+------------------------+
| ["johndoe@test.com"]   |
| ["janedoe@test.com"]   |
+------------------------+

现在我们可以看到,使用JSON_ARRAY函数,我们将从people表中的info列中的email提取为JSON数组。

如果我们需要从info列的键名中提取多个值为数组,则可以按如下方式编写SQL查询语句:

SELECT 
    JSON_ARRAY(
        JSON_EXTRACT(info, '.email'),
        JSON_EXTRACT(info, '.age')
    ) as personal_info
FROM 
    people;

输出的结果如下所示:

+------------------------+
| personal_info          |
+------------------------+
| ["johndoe@test.com",30]|
| ["janedoe@test.com",25]|
+------------------------+

现在,我们person_info这一列返回了包含email和age两个值的JSON数组。这就是如何将MySQL JSON列中的JSON对象的值提取为数组的方法。

4. 使用JSON_UNQUOTE函数

在上面的查询结果中,我们注意到返回的JSON数组值是带有引号的字符串。如果我们需要将字符串转换为实际的数组,可以使用JSON_UNQUOTE函数。JSON_UNQUOTE函数的语法如下:

JSON_UNQUOTE(json_val)

其中,json_val是代表JSON格式的MySQL表达式或当前会话中的字符串。

下面是将JSON数组字符串转换为实际数组的SQL查询语句:

SELECT 
    JSON_UNQUOTE(
        JSON_ARRAY(
            JSON_EXTRACT(info, '.email'),
            JSON_EXTRACT(info, '.age')
        )
    ) as personal_info
FROM 
    people;

输出的结果如下所示:

+------------------------+
| personal_info          |
+------------------------+
| ["johndoe@test.com",30]|
| ["janedoe@test.com",25]|
+------------------------+

现在返回的personal_info值是实际的JSON数组,没有引号。

总结

本文中,我们介绍了将MySQL JSON列中JSON对象的值提取为数组的方法。我们使用了MySQL内置的JSON_EXTRACT、JSON_ARRAY、JSON_UNQUOTE等函数来实现这一目标。在使用这些函数时,我们需要了解MySQL JSON数据类型的基本知识。这篇文章中提供的查询语句可以帮助我们处理MySQL JSON列中的复杂数据。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程