MySQL中JSON数据类型的使用(3)——JSON类型有关的操作

MySQL中JSON数据类型的使用(3)——JSON类型有关的操作

一、JSON的路径语法

学生(student)表的表结构和数据如下:

mysql> desc student;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| id      | int(11)  | NO   | PRI | NULL    |       |
| name    | char(20) | YES  |     | NULL    |       |
| birth   | datetime | YES  |     | NULL    |       |
| contact | json     | YES  |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)


mysql> select * from student;
+----------+-----------+---------------------+------------------------------------------------------------------------+
| id       | name      | birth               | contact                                                                |
+----------+-----------+---------------------+------------------------------------------------------------------------+
| 20190201 | ZhangTao  | 1999-01-20 00:00:00 | {
   
   "QQ": "2589781425", "phone": "15937320588", "wechart": "15937320588"} |
| 20190202 | LiPengfei | 1998-10-25 00:00:00 | {
   
   "QQ": "2589781466", "phone": "13903730582", "wechart": "13903730582"} |
| 20190203 | LiuFei    | 1999-11-02 00:00:00 | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"}    |
| 20190204 | ZhangTao  | 2000-08-06 00:00:00 | {
   
   "QQ": "1889781467", "phone": "15037334666", "wechart": "pa2568988"}   |
| 20190205 | ZhouPeng  | 2000-06-19 00:00:00 | {
   
   "QQ": "6689781444", "phone": "15346382599", "wechart": "ww26779821"}  |
+----------+-----------+---------------------+------------------------------------------------------------------------+
5 rows in set (0.01 sec)

学生(xs)表的表结构和数据如下:

mysql> desc xs;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(20) | YES  |     | NULL    |       |
| hobby | json     | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from xs;
+----------+------------+-----------------------------------------------------------+
| id       | name       | hobby                                                     |
+----------+------------+-----------------------------------------------------------+
| 20190101 | Zhang Peng | ["basketball", "football", "singsing"]                    |
| 20190102 | Liu Gang   | ["dancing", "piano", "football"]                          |
| 20190103 | Zhang Feng | ["Chess", "calligraphy", "violin", "dancing", "football"] |
+----------+------------+-----------------------------------------------------------+
3 rows in set (0.01 sec)

1、$:表示当前正在使用的JSON文档
2、.keyName:JSON对象中键名为 keyName 的值

例如:

mysql> select id,name,birth,contact ->> '$.phone' phone from student;
+----------+-----------+---------------------+-------------+
| id       | name      | birth               | phone       |
+----------+-----------+---------------------+-------------+
| 20190201 | ZhangTao  | 1999-01-20 00:00:00 | 15937320588 |
| 20190202 | LiPengfei | 1998-10-25 00:00:00 | 13903730582 |
| 20190203 | LiuFei    | 1999-11-02 00:00:00 | 13072615888 |
| 20190204 | ZhangTao  | 2000-08-06 00:00:00 | 15037334666 |
| 20190205 | ZhouPeng  | 2000-06-19 00:00:00 | 15346382599 |
+----------+-----------+---------------------+-------------+
5 rows in set (0.00 sec)

说明:在 contact ->> ’ . p h o n e ′ 中 , .phone' 中, .phone 表示 contact,.phone 表示 contact 中 phone 的键值。

3、.*:表示 JSON 对象中的所有 value

例如:

mysql> select name,contact ->> '$.*' contact from student;
+-----------+----------------------------------------------+
| name      | contact                                      |
+-----------+----------------------------------------------+
| ZhangTao  | ["2589781425", "15937320588", "15937320588"] |
| LiPengfei | ["2589781466", "13903730582", "13903730582"] |
| LiuFei    | ["1789781433", "13072615888", "wa159373"]    |
| ZhangTao  | ["1889781467", "15037334666", "pa2568988"]   |
| ZhouPeng  | ["6689781444", "15346382599", "ww26779821"]  |
+-----------+----------------------------------------------+
5 rows in set (0.00 sec)

4、[index]:JSON 数组中索引为 index 的值,JSON数组的索引从 0 开始
5、[*]:JSON 数组中的所有值

例如:

mysql> select id,name,hobby ->> '$[0]' from xs;
+----------+------------+------------------+
| id       | name       | hobby ->> '$[0]' |
+----------+------------+------------------+
| 20190101 | Zhang Peng | basketball       |
| 20190102 | Liu Gang   | dancing          |
| 20190103 | Zhang Feng | Chess            |
+----------+------------+------------------+
3 rows in set (0.00 sec)

mysql> select id,name,hobby ->> '$[*]' hobby from xs;
+----------+------------+-----------------------------------------------------------+
| id       | name       | hobby                                                     |
+----------+------------+-----------------------------------------------------------+
| 20190101 | Zhang Peng | ["basketball", "football", "singsing"]                    |
| 20190102 | Liu Gang   | ["dancing", "piano", "football"]                          |
| 20190103 | Zhang Feng | ["Chess", "calligraphy", "violin", "dancing", "football"] |
+----------+------------+-----------------------------------------------------------+
3 rows in set (0.00 sec)

二、操作 JSON 类型数据的常用函数

1、创建 json 值的函数

(1)JSON_ARRAY:生成 json 数组

语法如下:

JSON_ARRAY(val1,val2,val3...)

举例:

扫描二维码关注公众号,回复: 11781857 查看本文章
mysql> insert into xs values('20190201','Wang Ping',json_array("dancing", "piano"));
Query OK, 1 row affected (0.02 sec)

mysql> select * from xs;
+----------+------------+-----------------------------------------------------------+
| id       | name       | hobby                                                     |
+----------+------------+-----------------------------------------------------------+
| 20190101 | Zhang Peng | ["basketball", "football", "singsing"]                    |
| 20190102 | Liu Gang   | ["dancing", "piano", "football"]                          |
| 20190103 | Zhang Feng | ["Chess", "calligraphy", "violin", "dancing", "football"] |
| 20190201 | Wang Ping  | ["dancing", "piano"]                                      |
+----------+------------+-----------------------------------------------------------+
4 rows in set (0.00 sec)

(2)JSON_OBJECT:生成json对象

生成一个包含指定 Key-Value 对的 json object,参数个数必须为偶数。语法如下:

JSON_OBJECT(key1,val1,key2,val2...)

举例:

mysql> insert into student values('20200101','WangFei','1998-2-3',json_object("QQ","58794125","phone","15038971111","wechart","ya125879"));
Query OK, 1 row affected (0.01 sec)

mysql> select * from student where id='20200101';
+----------+---------+---------------------+-------------------------------------------------------------------+
| id       | name    | birth               | contact                                                           |
+----------+---------+---------------------+-------------------------------------------------------------------+
| 20200101 | WangFei | 1998-02-03 00:00:00 | {
   
   "QQ": "58794125", "phone": "15038971111", "wechart": "ya125879"} |
+----------+---------+---------------------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

2、查询 json 值的函数

(1)JSON_CONTAINS:查询指定数据是否存在

查询 json 文档是否在指定 path 包含指定的数据,包含则返回1,否则返回0。如果参数为 NULL 或 path 不存在,则返回NULL。语法如下:

JSON_CONTAINS(json_doc, val[, path])

例如:

mysql> select name from student where json_contains(contact,'"15037334666"','$.phone');
+----------+
| name     |
+----------+
| ZhangTao |
+----------+
1 row in set (0.00 sec)

(2)JSON_CONTAINS_PATH:查询指定路径是否存在

查询是否存在指定路径,存在则返回1,否则返回0。one_or_all 只能取值 “one” 或 “all”,one 表示只要有一个存在即可,all表示所有的都存在才行。语法如下:

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

举例:

mysql> select id,name,json_contains_path(contact,'one','$.phone') from student;
+----------+-----------+---------------------------------------------+
| id       | name      | json_contains_path(contact,'one','$.phone') |
+----------+-----------+---------------------------------------------+
| 20190201 | ZhangTao  |                                           1 |
| 20190202 | LiPengfei |                                           1 |
| 20190203 | LiuFei    |                                           1 |
| 20190204 | ZhangTao  |                                           1 |
| 20190205 | ZhouPeng  |                                           1 |
| 20200101 | WangFei   |                                           1 |
+----------+-----------+---------------------------------------------+
6 rows in set (0.00 sec)

(3)JSON_EXTRACT:查找指定的数据

从 json 文档中抽取数据。如果抽取出多个path,则返回的数据生成一个 json array。

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

举例:

mysql> select id,name,json_extract(contact,'$.QQ') QQ from student;
+----------+-----------+--------------+
| id       | name      | QQ           |
+----------+-----------+--------------+
| 20190201 | ZhangTao  | "2589781425" |
| 20190202 | LiPengfei | "2589781466" |
| 20190203 | LiuFei    | "1789781433" |
| 20190204 | ZhangTao  | "1889781467" |
| 20190205 | ZhouPeng  | "6689781444" |
| 20200101 | WangFei   | "58794125"   |
+----------+-----------+--------------+
6 rows in set (0.00 sec)

mysql> select id,name,json_extract(contact,'$.QQ','$.wechart') contact from student;
+----------+-----------+-------------------------------+
| id       | name      | contact                       |
+----------+-----------+-------------------------------+
| 20190201 | ZhangTao  | ["2589781425", "15937320588"] |
| 20190202 | LiPengfei | ["2589781466", "13903730582"] |
| 20190203 | LiuFei    | ["1789781433", "wa159373"]    |
| 20190204 | ZhangTao  | ["1889781467", "pa2568988"]   |
| 20190205 | ZhouPeng  | ["6689781444", "ww26779821"]  |
| 20200101 | WangFei   | ["58794125", "ya125879"]      |
+----------+-----------+-------------------------------+
6 rows in set (0.00 sec)

说明:JSON_EXTRACT 可以使用 -> 代替,例如:

mysql> select id,name,contact -> '$.QQ' QQ from student;
+----------+-----------+--------------+
| id       | name      | QQ           |
+----------+-----------+--------------+
| 20190201 | ZhangTao  | "2589781425" |
| 20190202 | LiPengfei | "2589781466" |
| 20190203 | LiuFei    | "1789781433" |
| 20190204 | ZhangTao  | "1889781467" |
| 20190205 | ZhouPeng  | "6689781444" |
| 20200101 | WangFei   | "58794125"   |
+----------+-----------+--------------+
6 rows in set (0.00 sec)

去掉查询结果中的双引号:

(A)可以使用 ->>,例如:

mysql> select id,name,contact ->> '$.QQ' QQ from student;
+----------+-----------+------------+
| id       | name      | QQ         |
+----------+-----------+------------+
| 20190201 | ZhangTao  | 2589781425 |
| 20190202 | LiPengfei | 2589781466 |
| 20190203 | LiuFei    | 1789781433 |
| 20190204 | ZhangTao  | 1889781467 |
| 20190205 | ZhouPeng  | 6689781444 |
| 20200101 | WangFei   | 58794125   |
+----------+-----------+------------+
6 rows in set (0.00 sec)

(B)使用 JSON_UNQUOTE 函数

mysql> select id,name,json_unquote(contact -> '$.QQ') QQ from student;
+----------+-----------+------------+
| id       | name      | QQ         |
+----------+-----------+------------+
| 20190201 | ZhangTao  | 2589781425 |
| 20190202 | LiPengfei | 2589781466 |
| 20190203 | LiuFei    | 1789781433 |
| 20190204 | ZhangTao  | 1889781467 |
| 20190205 | ZhouPeng  | 6689781444 |
| 20200101 | WangFei   | 58794125   |
+----------+-----------+------------+
6 rows in set (0.00 sec)

mysql> select id,name,json_unquote(json_extract(contact,'$.QQ')) QQ from student;
+----------+-----------+------------+
| id       | name      | QQ         |
+----------+-----------+------------+
| 20190201 | ZhangTao  | 2589781425 |
| 20190202 | LiPengfei | 2589781466 |
| 20190203 | LiuFei    | 1789781433 |
| 20190204 | ZhangTao  | 1889781467 |
| 20190205 | ZhouPeng  | 6689781444 |
| 20200101 | WangFei   | 58794125   |
+----------+-----------+------------+
6 rows in set (0.00 sec)

(4)JSON_KEYS

获取 json 文档在指定路径下的所有键值,返回一个 json array。语法如下:

JSON_KEYS(json_doc[, path])

举例:

mysql> select id,name,json_keys(contact) contact from student;
+----------+-----------+----------------------------+
| id       | name      | contact                    |
+----------+-----------+----------------------------+
| 20190201 | ZhangTao  | ["QQ", "phone", "wechart"] |
| 20190202 | LiPengfei | ["QQ", "phone", "wechart"] |
| 20190203 | LiuFei    | ["QQ", "phone", "wechart"] |
| 20190204 | ZhangTao  | ["QQ", "phone", "wechart"] |
| 20190205 | ZhouPeng  | ["QQ", "phone", "wechart"] |
| 20200101 | WangFei   | ["QQ", "phone", "wechart"] |
+----------+-----------+----------------------------+
6 rows in set (0.00 sec)

3、修改 json 值的函数

(1)JSON_UNQUOTE:去掉 json 值的引号(")

语法如下:

JSON_UNQUOTE(val)

举例:

mysql> select id,name,json_unquote(json_extract(contact,'$.QQ')) QQ from student;
+----------+-----------+------------+
| id       | name      | QQ         |
+----------+-----------+------------+
| 20190201 | ZhangTao  | 2589781425 |
| 20190202 | LiPengfei | 2589781466 |
| 20190203 | LiuFei    | 1789781433 |
| 20190204 | ZhangTao  | 1889781467 |
| 20190205 | ZhouPeng  | 6689781444 |
| 20200101 | WangFei   | 58794125   |
+----------+-----------+------------+
6 rows in set (0.00 sec)

(2)JSON_INSERT:在指定位置插入值

在指定 path下插入数据,如果 path 已存在,则忽略此 val(不存在才插入)。语法如下:

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

例如:

mysql> select name,contact from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | contact                                                             |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_insert(contact,'$.addr','Henan Xinxiang') from student where name='LiuFei';
+--------+-------------------------------------------------------+
| name   | json_insert(contact,'$.addr','Henan Xinxiang')                                                |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "addr": "Henan Xinxiang", "phone": "13072615888", "wechart": "wa159373"} |
+--------+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_insert(contact,'$.phone','10086') from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | json_insert(contact,'$.phone','10086')                              |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

(3)JSON_REMOVE:移除指定路径的值

移除指定路径的数据,如果某个路径不存在则略过此路径。语法如下:

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

举例:

mysql> select name,contact from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | contact                                                             |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_remove(contact,'$.QQ') from student where name='LiuFei';
+--------+-------------------------------------------------+
| name   | json_remove(contact,'$.QQ')                     |
+--------+-------------------------------------------------+
| LiuFei | {
   
   "phone": "13072615888", "wechart": "wa159373"} |
+--------+-------------------------------------------------+
1 row in set (0.00 sec)

(4)JSON_SET:设置指定路径的数据

语法如下:

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

举例:

mysql> select name,contact from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | contact                                                             |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_set(contact,'$.phone','10086') from student where name='LiuFei';
+--------+---------------------------------------------------------------+
| name   | json_set(contact,'$.phone','10086')                           |
+--------+---------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "10086", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------+
1 row in set (0.00 sec)

-- 路径$.phone2不存在,则增加一个路径$.phone2
mysql> select name,json_set(contact,'$.phone2','10086') from student where name='LiuFei';
+--------+---------------------------------------------------------------------------+
| name   | json_set(contact,'$.phone2','10086')                                                   |
+--------+---------------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "phone2": "10086", "wechart": "wa159373"} |
+--------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

(5)JSON_REPLACE:替换指定路径的数据

语法如下:

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

说明:
JSON_REPLACE 和 JSON_SET 的区别:使用 JSON_SET 时,如果路径不存在,则创建一个路径;使用 JSON_REPLACE 时,如果路径不存在,则忽略。

例如:

mysql> select name,contact from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | contact                                                             |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_replace(contact,'$.phone','10086') from student where name='LiuFei';
+--------+---------------------------------------------------------------+
| name   | json_replace(contact,'$.phone','10086')                       |
+--------+---------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "10086", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select name,json_replace(contact,'$.phone2','10086') from student where name='LiuFei';
+--------+---------------------------------------------------------------------+
| name   | json_replace(contact,'$.phone2','10086')                            |
+--------+---------------------------------------------------------------------+
| LiuFei | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"} |
+--------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

(6)JSON_ARRAY_INSERT:在指定位置插入数组元素

在 path 指定的 json array 元素插入数据,原位置及以右的元素顺次右移。如果指定的元素下标超过json array的长度,则插入尾部。

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

例如:

mysql> select id,name,hobby from xs where id='20190101';
+----------+------------+----------------------------------------+
| id       | name       | hobby                                  |
+----------+------------+----------------------------------------+
| 20190101 | Zhang Peng | ["basketball", "football", "singsing"] |
+----------+------------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select id,name,json_array_insert(hobby,'$[0]','piano') from xs where id='20190101';
+----------+------------+-------------------------------------------------+
| id       | name       | json_array_insert(hobby,'$[0]','piano')         |
+----------+------------+-------------------------------------------------+
| 20190101 | Zhang Peng | ["piano", "basketball", "football", "singsing"] |
+----------+------------+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> select id,name,json_array_insert(hobby,'$[10]','piano') from xs where id='20190101';
+----------+------------+-------------------------------------------------+
| id       | name       | json_array_insert(hobby,'$[10]','piano')        |
+----------+------------+-------------------------------------------------+
| 20190101 | Zhang Peng | ["basketball", "football", "singsing", "piano"] |
+----------+------------+-------------------------------------------------+
1 row in set (0.00 sec)

(7)JSON_MERGE:合并

合并多个json文档。规则如下:如果都是 json array,则结果自动合并为一个 json array;如果都是json object,则结果自动合并为一个 json object;如果有多种类型,则将非 json array 的元素封装成 json array 再按照规则进行合并。语法如下:

JSON_MERGE(json_doc, json_doc[, json_doc] ...)

例如:

mysql> select json_merge(json_object("id",1,"name","Tom"),json_object("age",20));
+--------------------------------------------------------------------+
| json_merge(json_object("id",1,"name","Tom"),json_object("age",20)) |
+--------------------------------------------------------------------+
| {
   
   "id": 1, "age": 20, "name": "Tom"}                                |
+--------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select json_merge(json_array("Zhangsan","Lisi"),json_array("Wangwu"));
+----------------------------------------------------------------+
| json_merge(json_array("Zhangsan","Lisi"),json_array("Wangwu")) |
+----------------------------------------------------------------+
| ["Zhangsan", "Lisi", "Wangwu"]                                 |
+----------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select json_merge(json_object("id",1,"name","Tom"),json_array(10,20));
+----------------------------------------------------------------+
| json_merge(json_object("id",1,"name","Tom"),json_array(10,20)) |
+----------------------------------------------------------------+
| [{
   
   "id": 1, "name": "Tom"}, 10, 20]                             |
+----------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

4、返回 json 值属性的函数

(1)JSON_DEPTH:深度

获取 json 文档的深度。语法如下:

JSON_DEPTH(json_doc)

举例:

mysql> select id,name,contact,json_depth(contact) from student where id='20190201';
+----------+----------+------------------------------------------------------------------------+---------------------+
| id       | name     | contact                                                                | json_depth(contact) |
+----------+----------+------------------------------------------------------------------------+---------------------+
| 20190201 | ZhangTao | {
   
   "QQ": "2589781425", "phone": "15937320588", "wechart": "15937320588"} |                   2 |
+----------+----------+------------------------------------------------------------------------+---------------------+
1 row in set (0.00 sec)

(2)JSON_LENGTH:长度

获取指定路径下的长度。json array 的长度为元素的个数;json object的长度为key的个数。语法如下:

JSON_LENGTH(json_doc[, path])

例如:

mysql> select name,hobby,json_length(hobby) from xs;
+------------+-----------------------------------------------------------+--------------------+
| name       | hobby                                                  | json_length(hobby) |
+------------+------------------------------------------------------+--------------------+
| Zhang Peng | ["basketball", "football", "singsing"]                    |          3 |
| Liu Gang   | ["dancing", "piano", "football"]                          |          3 |
| Zhang Feng | ["Chess", "calligraphy", "violin", "dancing", "football"] |          5 |
| Wang Ping  | ["dancing", "piano"]                                      |          2 |
+------------+-----------------------------------------------------------+------------+
4 rows in set (0.00 sec)

mysql> select name,contact,json_length(contact) from student;
+-----------+------------------------------------------------------------------------+----------------------+
| name      | contact                                                                | json_length(contact) |
+-----------+------------------------------------------------------------------------+----------------------+
| ZhangTao  | {
   
   "QQ": "2589781425", "phone": "15937320588", "wechart": "15937320588"} |                    3 |
| LiPengfei | {
   
   "QQ": "2589781466", "phone": "13903730582", "wechart": "13903730582"} |                    3 |
| LiuFei    | {
   
   "QQ": "1789781433", "phone": "13072615888", "wechart": "wa159373"}    |                    3 |
| ZhangTao  | {
   
   "QQ": "1889781467", "phone": "15037334666", "wechart": "pa2568988"}   |                    3 |
| ZhouPeng  | {
   
   "QQ": "6689781444", "phone": "15346382599", "wechart": "ww26779821"}  |                    3 |
| WangFei   | {
   
   "QQ": "58794125", "phone": "15038971111", "wechart": "ya125879"}      |                    3 |
+-----------+------------------------------------------------------------------------+----------------------+
6 rows in set (0.00 sec)

(3)JSON_TYPE:类型

获取 json 文档的具体类型。语法如下:

JSON_TYPE(json_val)

举例:

mysql> select id,name,json_type(contact) from student;
+----------+-----------+--------------------+
| id       | name      | json_type(contact) |
+----------+-----------+--------------------+
| 20190201 | ZhangTao  | OBJECT             |
| 20190202 | LiPengfei | OBJECT             |
| 20190203 | LiuFei    | OBJECT             |
| 20190204 | ZhangTao  | OBJECT             |
| 20190205 | ZhouPeng  | OBJECT             |
| 20200101 | WangFei   | OBJECT             |
+----------+-----------+--------------------+
6 rows in set (0.00 sec)

mysql> select id,name,json_type(hobby) from xs;
+----------+------------+------------------+
| id       | name       | json_type(hobby) |
+----------+------------+------------------+
| 20190101 | Zhang Peng | ARRAY            |
| 20190102 | Liu Gang   | ARRAY            |
| 20190103 | Zhang Feng | ARRAY            |
| 20190201 | Wang Ping  | ARRAY            |
+----------+------------+------------------+
4 rows in set (0.01 sec)

(4)JSON_VALID:是否是有效的 json 格式

判断val是否为有效的json格式,是为1,不是为0。语法如下:

JSON_VALID(val)

举例:

mysql> select json_valid('{"age":0}');  --有效的json格式
+-------------------------+
| json_valid('{"age":0}') |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select json_valid('[11,22]'); --有效的json格式
+-----------------------+
| json_valid('[11,22]') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select json_valid('"abc":0'); --无效的json格式
+-----------------------+
| json_valid('"abc":0') |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/107829700