【MySQL】MySQL 8 的 JSON 新特性详解(2)JSON 函数

举报
小雨青年 发表于 2023/02/04 08:46:19 2023/02/04
【摘要】 详细说明的MySQL 8 中 JSON 函数的用法。

一、概述

在上一篇文章,我们学习了MySQL 8 的 JSON 相关的新特性,并搭建本地环境,尝试了MySQL 8 新支持的 JSON 数据类型。

下面,让我们继续学习MySQL 8 的 JSON 相关的新特性——JSON 函数。

JSON 函数:MySQL 8 提供了一组内置函数,允许您提取和操纵 JSON 数据。例如,JSON_EXTRACT 函数允许您从 JSON 文档中提取值,JSON_ARRAY 函数允许您创建 JSON 数组,JSON_OBJECT 函数允许您创建 JSON 对象。

二、本地环境和数据

由于之前做过详细说明,所以这次我只列出执行的命令。

1.创建docker环境

docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=password -p 3310:3306 -d mysql:8

2.创建初始数据

CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE mydatabase;

CREATE TABLE mytable (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  phone VARCHAR(255) NOT NULL,
  data JSON,
  UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_General_ci;

INSERT INTO mytable (name, email, phone, data) VALUES 
("John Doe", "johndoe@example.com", "555-555-5555", '{"address": {"city": "San Francisco", "state": "CA"}}'), 
("Jane Doe", "janedoe@example.com", "555-555-5556", '{"address": {"city": "New York", "state": "NY"}}'), 
("Jim Smith", "jimsmith@example.com", "555-555-5557", '{"address": {"city": "Los Angeles", "state": "CA"}}');

三、JSON 函数详解

1. JSON_EXTRACT()

JSON_EXTRACT()是MySQL8支持的一个函数,用于从JSON数据中提取指定的键或索引的值。该函数的语法如下:

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

参数说明:

  • json_doc:需要提取数据的JSON字符串。
  • path:提取数据的键或索引路径。

举个例子,如果我们有一个名为mytable的表,表中有一个名为data的JSON字段,那么我们可以使用以下语句来提取JSON字段中的地址信息:

SELECT name, email, phone, JSON_EXTRACT(data, '$.address') as address, 
       JSON_EXTRACT(data, '$.address.city') as city, JSON_EXTRACT(data, '$.address.state') as state
FROM mytable;

执行结果如下图所示。

image-20230204071426709

这样,我们就可以通过JSON_EXTRACT()函数来提取JSON字段中的数据,并将其显示为普通字段。

2. JSON_SET() 、JSON_REPLACE()、 JSON_REMOVE()

这三个函数的用法差不多,所以放在一起,是对JSON文档进行插入替换移除。

JSON_SET(json_doc, path, val[, path, val] ...)

JSON_REPLACE(json_doc, path, val[, path, val] ...)

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

参数:

  • json_doc: 要更新的 JSON 文档。
  • path: 在文档中的路径,指向要替换的值的位置。
  • val: 要替换的值。
UPDATE mytable SET data = JSON_SET(data, '$.address.city', '22 Wall St.') WHERE id = 1;
UPDATE mytable SET data = JSON_REPLACE(data, '$.address.city', '23 Wall St.') WHERE id = 1;
UPDATE mytable SET data = JSON_REMOVE(data, '$.address.city') WHERE id = 1;

3.JSON_OBJECT()

JSON_OBJECT() 函数用于创建一个包含多个键值对的 JSON 对象。该函数接受任意数量的键值对参数,并将其作为 JSON 对象的键值对返回。

JSON_OBJECT(key1, value1, [key2, value2, ...])

比如。

SELECT JSON_OBJECT('name', 'John Doe', 'email', 'johndoe@example.com', 'age', 25);

结果如下。

{"name": "John Doe", "email": "johndoe@example.com", "age": 25}

他的在实际业务中的用法,是可以直接在SQL中返回json。

SELECT JSON_OBJECT(
  'id', id,
  'first_name', first_name,
  'last_name', last_name,
  'email', email,
  'address', address,
  'city', city,
  'state', state,
  'zip', zip
)
FROM users;

4.JSON_ARRAY()、 JSON_MERGE()

JSON_ARRAY() 函数可以将一组值转换为 JSON 数组,例如:

SELECT JSON_ARRAY(name, email) FROM mytable WHERE id = 1;

它的返回结果类似于:

["John Doe", "johndoe@example.com"]

在实际业务中,可以使用它来创建一组数据的 JSON 数组,例如:将多条数据的名字和邮件地址转换为一个 JSON 数组。

JSON_MERGE() 函数可以将多个 JSON 值合并为一个 JSON 值,例如:

SELECT JSON_MERGE(data, '{"age": 30}') FROM mytable WHERE id = 1;

它的返回结果类似于:

{"name": "John Doe", "email": "johndoe@example.com", "age": 30}

在实际业务中,可以使用它来合并多个 JSON 值,例如:将一个表的多条数据合并为一条 JSON 值,以方便更方便地处理数据。

5. JSON_QUOTE()

JSON_QUOTE() 函数用于在字符串的两端加上引号,并将其转换为一个 JSON 字符串。

举个例子,如果有一个名为 name 的字符串变量:

SET @name = 'John Doe';

您可以使用 JSON_QUOTE() 函数将其转换为一个 JSON 字符串:

SELECT JSON_QUOTE(@name) AS json_name;

返回值为

{"json_name":"John Doe"}

可以看到,JSON_QUOTE() 在字符串的两端添加了引号,并将其转换为了一个 JSON 字符串。

6.JSON_TYPE() 、JSON_VALID()

JSON_TYPE() 函数: 该函数用于检测 JSON 表达式的类型,返回一个字符串表示 JSON 类型。支持的类型有:

  • OBJECT:表示 JSON 对象
  • ARRAY:表示 JSON 数组
  • STRING:表示字符串
  • INTEGER:表示整数
  • DECIMAL:表示小数
  • BOOLEAN:表示布尔值
SELECT 
  JSON_TYPE('{"name":"John", "age": 30}') as object_type,
  JSON_TYPE('["apple", "banana", "cherry"]') as array_type,
  JSON_TYPE('"Hello World"') as string_type,
  JSON_TYPE('42') as integer_type,
  JSON_TYPE('3.14') as decimal_type,
  JSON_TYPE('true') as boolean_type;

JSON_VALID() 函数: 该函数用于检测 JSON 字符串是否合法,如果合法返回 true,否则返回 false。

SELECT 
  JSON_VALID('{"name":"John", "age": 30}') as valid_json,
  JSON_VALID('{"name":"John", age: 30}') as invalid_json;

7.JSON_SEARCH()

JSON_SEARCH() 函数用于在 JSON 数据中搜索某个字符串,并返回其位置。该函数有以下语法:

JSON_SEARCH(json_doc, one_or_all, search_str [, escape_char [, path]])

  • json_doc:要搜索的 JSON 数据
  • one_or_all:搜索模式,可以为“one”或“all”,表示只搜索一次或搜索所有结果
  • search_str:要搜索的字符串
  • escape_char:可选,指定一个字符来转义搜索字符串中的特殊字符
  • path:可选,指定搜索的路径
SELECT JSON_SEARCH(data, 'one', 'Baker');

这条语句将在 data 列中搜索字符串 'Baker',并返回其位置。如果找到,则该函数返回 JSON 字符串的路径;如果没有找到,则返回 NULL

8.JSON_UNQUOTE()

JSON_UNQUOTE() 函数可以解除引号并返回字符串。该函数接受一个参数,并返回不带引号的字符串。

SELECT JSON_UNQUOTE(data->>'$.address.city') AS city FROM mytable;

注意:如果数据不是字符串,则该函数不会解除引号。

四、总结

这次我们详细说明的MySQL 8 中 JSON 函数的用法。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。