前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8.0 JSON函数之创建与返回JSON属性(四)

MySQL8.0 JSON函数之创建与返回JSON属性(四)

作者头像
SEian.G
发布2021-07-07 15:01:25
2.7K0
发布2021-07-07 15:01:25
举报
文章被收录于专栏:SEian.G学习记录

经过前面三篇的文章的介绍,相信大家已经对MySQL JSON数据类型有了一定的了解,为了在业务中更好的使用JSON类型,今天我们来具体介绍一下JSON函数的使用;

根据JSON函数的作用,我们将JSON函数划分为如下几个类别:

(1)创建JSON值的函数 (2)返回JSON值属性的函数 (3)搜索JSON值的函数 (4)修改JSON值的函数 (5)JSON表功能函数

本文我们将介绍创建和返回JSON值属性的相关函数的使用方法;

一、创建JSON值的函数

JSON_ARRAY([val[, val] …])

计算值列表(可能为空),并返回包含这些值的JSON数组。

代码语言:javascript
复制
mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
+---------------------------------------------+
| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
+---------------------------------------------+
| [1, "abc", null, true, "14:11:17.000000"]   |
+---------------------------------------------+
1 row in set (0.00 sec)

JSON_OBJECT([key, val[, key, val] …])

计算键值对的列表(可能为空),并返回包含这些键值对的JSON对象。如果任何键名为NULL或参数个数为奇数,则会发生错误。

代码语言:javascript
复制
mysql>SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
+-----------------------------------------+
| JSON_OBJECT('id', 87, 'name', 'carrot') |
+-----------------------------------------+
| {"id": 87, "name": "carrot"}            |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_OBJECT('id', 87, '', 'carrot');    
+-------------------------------------+
| JSON_OBJECT('id', 87, '', 'carrot') |
+-------------------------------------+
| {"": "carrot", "id": 87}            |
+-------------------------------------+
1 row in set (0.00 sec)
 
mysql >SELECT JSON_OBJECT('id', 87, 'carrot');    
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_OBJECT'
 
mysql>SELECT JSON_OBJECT('id', 87, null, 'carrot');  
ERROR 3158 (22032): JSON documents may not contain NULL member names.

JSON_QUOTE(string)

通过使用双引号字符和转义内部引号以及其他字符将字符串括起来作为JSON值引用,然后将结果作为utf8mb4字符串返回。如果参数为NULL,则返回NULL。

此函数通常用于生成有效的JSON字符串文字,以包含在JSON文档中。

代码语言:javascript
复制
mysql>SELECT JSON_QUOTE('[1, 2, 3]');
+-------------------------+
| JSON_QUOTE('[1, 2, 3]') |
+-------------------------+
| "[1, 2, 3]"             |
+-------------------------+
1 row in set (0.00 sec)

二、返回JSON值属性函数

JSON_DEPTH(json_doc)

返回 JSON 文档的最大深度。如果参数为 NULL,则 返回 NULL。如果参数不是有效的 JSON 文档,则会发生错误。

空数组、空对象或标量值的深度为1。仅包含深度为1的元素的非空数组或仅包含深度为1的成员值的非空对象的深度为2。否则,JSON文档的深度大于2。

代码语言:javascript
复制
mysql>SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true');
+------------------+------------------+--------------------+
| JSON_DEPTH('{}') | JSON_DEPTH('[]') | JSON_DEPTH('true') |
+------------------+------------------+--------------------+
|                1 |                1 |                  1 |
+------------------+------------------+--------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_DEPTH('[10, 20]'), JSON_DEPTH('[[], {}]');
+------------------------+------------------------+
| JSON_DEPTH('[10, 20]') | JSON_DEPTH('[[], {}]') |
+------------------------+------------------------+
|                      2 |                      2 |
+------------------------+------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_DEPTH('[10, {"a": 20}]');
+-------------------------------+
| JSON_DEPTH('[10, {"a": 20}]') |
+-------------------------------+
|                             3 |
+-------------------------------+
1 row in set (0.00 sec)

JSON_LENGTH(json_doc[, path])

返回 JSON 文档的长度,或者,如果path给出了参数,则返回 由路径标识的文档中值的长度。如果任何参数为NULL或路径参数未在文档中标识值,则返回NULL。如果json_doc参数不是有效的 JSON 文档或 path参数不是有效的路径表达式或包含通配符*或 **通配符,则会发生错误。

代码语言:javascript
复制
mysql> SELECT JSON_LENGTH('[1, 2, {"a": 3}]');
+---------------------------------+
| JSON_LENGTH('[1, 2, {"a": 3}]') |
+---------------------------------+
|                               3 |
+---------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');
+-----------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}') |
+-----------------------------------------+
|                                       2 |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c') |
+------------------------------------------------+
|                                           NULL |
+------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d') |
+------------------------------------------------+
|                                           NULL |
+------------------------------------------------+
1 row in set (0.00 sec)

文档的长度确定如下:

  • 标量的长度为 1。
  • 数组的长度是数组元素的数量。
  • 对象的长度是对象成员的数量。
  • 长度不计算嵌套数组或对象的长度。

JSON_TYPE(json_val)

返回utf8mb4指示JSON值类型的字符串。这可以是对象、数组或标量类型,如下所示:

代码语言:javascript
复制
mysql>SELECT JSON_TYPE(@j);
+---------------+
| JSON_TYPE(@j) |
+---------------+
| OBJECT        |
+---------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));
+------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a')) |
+------------------------------------+
| ARRAY                              |
+------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')) |
+---------------------------------------+
| INTEGER                               |
+---------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')) |
+---------------------------------------+
| BOOLEAN                               |
+---------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]')) |
+---------------------------------------+
| NULL                                  |
+---------------------------------------+
1 row in set (0.00 sec)

如果参数为 NULL,JSON_TYPE()返回 NULL:

代码语言:javascript
复制
mysql>SELECT JSON_TYPE(NULL);
+-----------------+
| JSON_TYPE(NULL) |
+-----------------+
| NULL            |
+-----------------+
1 row in set (0.00 sec)

如果参数不是有效的 JSON 值,则会发生错误:

代码语言:javascript
复制
mysql dba_admin@127.0.0.1:(none)14:18:07> SELECT JSON_TYPE(1);
ERROR 3146 (22032): Invalid data type for JSON data in argument 1 to function json_type; a JSON string or JSON type is required.

对于非NULL、非错误结果,以下列表描述了可能的 JSON_TYPE()返回值:

* 纯JSON类型: *OBJECT: JSON 对象 *ARRAY: JSON 数组 *BOOLEAN:JSON 真假文字 *NULL:JSON 空字面量 *数字类型: *INTEGER: MySQL TINYINT, SMALLINT, MEDIUMINTand INT和 BIGINT标量 *DOUBLE: MySQL 标量 DOUBLE FLOAT *DECIMAL: MySQL DECIMAL和 NUMERIC标量 *时间类型: *DATETIME: MySQL DATETIME和 TIMESTAMP标量 *DATE: MySQL DATE标量 *TIME: MySQL TIME标量 *字符串类型: *STRING: MySQL utf8字符类型标量: CHAR, VARCHAR, TEXT, ENUM, and SET *二进制类型: *BLOB:MySQL二进制标量类型包括BINARY, VARBINARY, BLOB,和 BIT *所有其他类型: *OPAQUE (原始位)

JSON_VALID(val)

返回0或1以指示值是否为有效的JSON。如果参数为NULL,则返回NULL。

代码语言:javascript
复制
mysql>SELECT JSON_VALID('{"a": 1}');
+------------------------+
| JSON_VALID('{"a": 1}') |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_VALID('hello'), JSON_VALID('"hello"');
+---------------------+-----------------------+
| JSON_VALID('hello') | JSON_VALID('"hello"') |
+---------------------+-----------------------+
|                   0 |                     1 |
+---------------------+-----------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_VALID(NULL), JSON_VALID('"hello"');      
+------------------+-----------------------+
| JSON_VALID(NULL) | JSON_VALID('"hello"') |
+------------------+-----------------------+
|             NULL |                     1 |
+------------------+-----------------------+
1 row in set (0.00 sec)

好了,今天就先介绍到这里,关于JSON函数更多内容,后续会慢慢进行介绍;

关联阅读

MySQL 8.0 JSON增强到底有多强?(一)

MySQL如何给JSON列添加索引(二)

MySQL 8.0 新特性:多值索引 --如何给JSON数组添加索引(三)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA的辛酸事儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、创建JSON值的函数
  • 二、返回JSON值属性函数
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档