【MySQL】MySQL 8 的 JSON 新特性详解(2)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;
执行结果如下图所示。
这样,我们就可以通过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 函数的用法。
- 点赞
- 收藏
- 关注作者
评论(0)