Home > Database > Mysql Tutorial > How to use json_extract in mysql

How to use json_extract in mysql

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2023-05-31 16:58:16
forward
1895 people have browsed it
    ##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;
    Copy after login
    # 插入两条测试用的记录
    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"}]');
    Copy after login

    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                |
    +--------------------+
    Copy after login
    - 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            |
    +------------------+
    Copy after login

    - 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                  |
    +---------------------+
    Copy after login

    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", "湖南", "长沙"]                                              |
    +----------------------------------------------------------------------+
    Copy after login

    - 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"}]}')
    Copy after login

    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"]            |
    +-----------------------------+
    Copy after login

    - 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                            |
    +---------------------------------+
    Copy after login

    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                               |
    +------------------------------------+
    Copy after login

    - Return error

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

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

    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.
    Copy after login

    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!

    Related labels:
    source:yisu.com
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Latest Issues
    MySQL stops process
    From 1970-01-01 08:00:00
    0
    0
    0
    Error when installing mysql on linux
    From 1970-01-01 08:00:00
    0
    0
    0
    phpstudy cannot start mysql?
    From 1970-01-01 08:00:00
    0
    0
    0
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template