0
点赞
收藏
分享

微信扫一扫

【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;

执行结果如下图所示。

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 函数的用法。

举报

相关推荐

0 条评论