Home  >  Article  >  Database  >  How to use json_extract in mysql

How to use json_extract in mysql

WBOY
WBOYforward
2023-05-31 16:58:161772browse
    ##1. Foreword

    mysql5.7 version begins to support JSON type fields

    json_extract can be completely abbreviated as
    -> json_unquote(json_extract()) can be completely abbreviated as
    ->>Most of the following introductions will use the abbreviation

    2. Create Example table

    CREATE TABLE `test_json` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `content` json DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
    # 插入两条测试用的记录
    INSERT INTO `test_json` (`content`) VALUES ('{\"name\":\"tom\",\"age\":18,\"score\":[100,90,87],\"address\":{\"province\":\"湖南\",\"city\":\"长沙\"}}');
    INSERT INTO `test_json` (`content`) VALUES ('[1, "apple", "red", {"age": 18, "name": "tom"}]');

    idcontent1{"age": 18, "name": "tom", "score": [100, 90, 87], "address": {"city": "Changsha", "province": "Hunan"}} 2[1, “apple”, “red”, {“age”: 18, “name”: “tom”}]
    3. Basic syntax

    - Obtain the value corresponding to a key in the JSON object

    • In the json_extract function, the first One parameter content represents json data, and the second parameter is the json path, where $ represents the json data itself, and $.name represents obtaining the value with the key name in json

    • You can use -> expression instead of json_extract

    • If the obtained val itself is a string, then the obtained val will be wrapped in quotation marks, such as "tom", this kind of data is When parsed into a program object, it may be escaped as \"tom\". In order to solve this problem, you can wrap another layer of json_unquote function outside, or use ->> instead of ->

    content:

    {" age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “Changsha”, “province”: “Hunan”}}

    # 得到"tom"
    select json_extract(content,'$.name') from test_json where id = 1;
    # 简写方式:字段名->表达式等价于json_extract(字段名,表达式)
    select content->'$.name' from test_json where id = 1;
    # 结果:
    +--------------------------------+
    | json_extract(content,'$.name') |
    +--------------------------------+
    | "tom"                          |
    +--------------------------------+
    +-------------------+
    | content->'$.name' |
    +-------------------+
    | "tom"             |
    +-------------------+
    
    # 解除双引号,得到tom
    select json_unquote(json_extract(content,'$.name')) from test_json where id = 1;
    # 简写方式:字段名->>表达式等价于json_unquote(json_extract(字段名,表达式))
    select content->>'$.name' from test_json where id = 1;
    # 结果:
    +----------------------------------------------+
    | json_unquote(json_extract(content,'$.name')) |
    +----------------------------------------------+
    | tom                                          |
    +----------------------------------------------+
    +--------------------+
    | content->>'$.name' |
    +--------------------+
    | tom                |
    +--------------------+
    - Get an element in the JSON array

    • In the json_extract function, the first parameter content represents json data, and the second parameter is the json path, where $ Represents the json data itself, $[i] indicates obtaining the element with index i of the json array (the index starts from 0)

    • is the same as obtaining key-val, if the obtained element is For strings, the default method will also get characters enclosed in double quotes, causing the program to escape. The method is also to use the json_unquote function, or use ->> instead of ->

    ##content:
    [1, “apple”, “red”, {“age”: 18, “name”: “tom”}]


    # 得到"apple"
    select json_extract(content,'$[1]') from test_json where id = 2;
    # 简写,效果同上
    select content->'$[1]' from test_json where id = 2;
    # 结果:
    +------------------------------+
    | json_extract(content,'$[1]') |
    +------------------------------+
    | "apple"                      |
    +------------------------------+
    +-----------------+
    | content->'$[1]' |
    +-----------------+
    | "apple"         |
    +-----------------+
    
    # 解除双引号,得到apple 
    select json_unquote(json_extract(content,'$[1]')) from test_json where id = 2;
    # 简写,效果同上
    select content->>'$[1]' from test_json where id = 2;
    # 结果:
    +--------------------------------------------+
    | json_unquote(json_extract(content,'$[1]')) |
    +--------------------------------------------+
    | apple                                      |
    +--------------------------------------------+
    +------------------+
    | content->>'$[1]' |
    +------------------+
    | apple            |
    +------------------+

    - Get JSON Nested data

    Combined with the two acquisition methods introduced earlier, you can obtain the nested data in json data

    content: id=1
    {"age": 18 , “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “Changsha”, “province”: “Hunan”}}

    content: id= 2
    [1, “apple”, “red”, {“age”: 18, “name”: “tom”}]

    # 得到:87
    select content->'$.score[2]' from test_json where id = 1;
    # 结果:
    +-----------------------+
    | content->'$.score[2]' |
    +-----------------------+
    | 87                    |
    +-----------------------+
    
    # 得到:18
    select content->'$[3].age' from test_json where id = 2;
    # 结果:
    +---------------------+
    | content->'$[3].age' |
    +---------------------+
    | 18                  |
    +---------------------+

    4. Getting better

    - Obtain JSON data of multiple paths

    Will combine the data of multiple paths into an array and return

    content: id=1
    {"age": 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “Changsha”, “province”: “Hunan”}}


    select json_extract(content,'$.age','$.score') from test_json where id = 1;
    # 结果:
    +-----------------------------------------+
    | json_extract(content,'$.age','$.score') |
    +-----------------------------------------+
    | [18, [100, 90, 87]]                     |
    +-----------------------------------------+
    
    select json_extract(content,'$.name','$.address.province','$.address.city') from test_json where id = 1;
    # 结果:
    +----------------------------------------------------------------------+
    | json_extract(content,'$.name','$.address.province','$.address.city') |
    +----------------------------------------------------------------------+
    | ["tom", "湖南", "长沙"]                                              |
    +----------------------------------------------------------------------+

    - The use of path expression *

    will combine the data of multiple paths into an array and return

    # 先插入一条用于测试的数据
    INSERT INTO `test_json` (`id`,`content`) VALUES(3,'{"name":"tom","address":{"name":"中央公园","city":"长沙"},"class":{"id":3,"name":"一年三班"},"friend":[{"age":20,"name":"marry"},{"age":21,"name":"Bob"}]}')

    content: id=3
    {“name ": "tom", "class": {"id": 3, "name": "Class Three a Year"}, "friend": [{"age": 20, "name": "marry"}, {"age": 21, "name": "Bob"}], "address": {"city": "Changsha", "name": "Central Park"}}


    # 获取所有二级嵌套中key=name的值
    # 由于friend的二级嵌套是一个数组,所以.name获取不到其中的所有name值
    select content->'$.*.name' from test_json where id = 3;
    +----------------------------------+
    | content->'$.*.name'              |
    +----------------------------------+
    | ["一年三班", "中央公园"]         |
    +----------------------------------+```
    
    # 获取所有key为name值的数据,包括任何嵌套内的name
    select content->'$**.name' from test_json where id = 3;
    +---------------------------------------------------------+
    | content->'$**.name'                                     |
    +---------------------------------------------------------+
    | ["tom", "一年三班", "marry", "Bob", "中央公园"]         |
    +---------------------------------------------------------+
    
    # 获取数组中所有的name值
    select content->'$.friend[*].name' from test_json where id = 3;
    +-----------------------------+
    | content->'$.friend[*].name' |
    +-----------------------------+
    | ["marry", "Bob"]            |
    +-----------------------------+

    - Return NULL value

    content: id=1
    {"age": 18, "name": "tom", "score": [100, 90, 87], "address" ": {"city": "Changsha", "province": "Hunan"}}


    The JSON path you are looking for does not exist
    # age路径不存在,返回NULL
    # 若有多个路径,只要有一个路径存在则不会返回NULL
    select json_extract(content,'$.price') from test_json where id = 1;
    +---------------------------------+
    | json_extract(content,'$.price') |
    +---------------------------------+
    | NULL                            |
    +---------------------------------+

    There are NULL

    in the path
    # 存在任意路径为NULL则返回NULL
    select json_extract(content,'$.age',NULL) from test_json where id = 1;
    +------------------------------------+
    | json_extract(content,'$.age',NULL) |
    +------------------------------------+
    | NULL                               |
    +------------------------------------+

    - Return error

    If the first parameter is not JSON type data, return error

    select json_extract('{1,2]',$[0])

    If the path expression is not standardized, return error

    select content->'$age' from test_json where id = 1;
    # 结果:
    ERROR 3143 (42000): Invalid JSON path expression. The error is around character position 1.

    5. Usage scenarios

    The JSON_EXTRACT function is usually used when you want to obtain a specific data in JSON or use it as a judgment condition

    The above is the detailed content of How to use json_extract in mysql. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete