Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menggunakan json_extract dalam mysql

Bagaimana untuk menggunakan json_extract dalam mysql

WBOY
WBOYke hadapan
2023-05-31 16:58:161772semak imbas

    1 Kata Pengantar

    versi mysql5.7 mula menyokong medan jenis JSON
    json_extract boleh disingkatkan sepenuhnya sebagai - >
    json_unquote(json_extract()) boleh disingkatkan sepenuhnya sebagai ->>
    Kebanyakan pengenalan berikut akan menggunakan singkatan

    2. Cipta jadual Contoh

    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;
    rrree
    id content
    1 {“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
    2 [1, “apple”, “red”, {“age”: 18, “name”: “tom”}]

    3. Sintaks asas

    - Dapatkan nilai yang sepadan dengan kunci dalam objek JSON

    • Dalam fungsi json_extract, Kandungan parameter pertama mewakili data json, dan parameter kedua ialah laluan json, di mana $ mewakili data json itu sendiri, dan $.name mewakili mendapatkan nilai dengan nama kunci dalam json

    • Anda boleh menggunakan -> dan bukannya json_extract

    • Jika val yang diperolehi itu sendiri adalah rentetan, maka val yang diperolehi akan dibalut dengan petikan, seperti "tom", data jenis ini Mungkin terlepas sebagai "tom" apabila dihuraikan ke dalam objek program. Untuk menyelesaikan masalah ini, anda boleh membungkus lapisan lain fungsi json_unquote di luar atau menggunakan ->>

    kandungan:
    { " umur”: 18, “nama”: “tom”, “skor”: [100, 90, 87], “alamat”: {“bandar”: “Changsha”, “daerah”: “Hunan”}}

    # 插入两条测试用的记录
    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"}]');

    - Dapatkan elemen dalam tatasusunan JSON

    • Dalam fungsi json_extract, kandungan parameter pertama mewakili data json, dan parameter kedua ialah laluan json, di mana $ Mewakili data json itu sendiri, $[i] menunjukkan mendapatkan elemen dengan indeks i tatasusunan json (indeks bermula dari 0)

    • adalah sama dengan mendapatkan key-val , jika elemen yang diperolehi ialah Untuk rentetan, kaedah lalai juga akan mendapatkan aksara yang disertakan dalam petikan berganda, menyebabkan atur cara ini juga menggunakan fungsi json_unquote, atau gunakan ->> 🎜>

    kandungan:

    [1, “epal”, “merah”, {“umur”: 18, “nama”: “tom”}]

    # 得到"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                |
    +--------------------+
    - Dapatkan kandungan dalam data JSON Nested

    Digabungkan dengan dua kaedah pemerolehan yang diperkenalkan sebelum ini, anda boleh mendapatkan data bersarang dalam data json

    kandungan: id =1

    {"umur": 18 , “nama”: “tom”, “skor”: [100, 90, 87], “alamat”: {“bandar”: “Changsha”, “daerah”: “ Hunan”}}
    kandungan: id= 2
    [1, “epal”, “merah”, {“umur”: 18, “nama”: “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            |
    +------------------+
    4. Menjadi lebih baik dan lebih baik

    - Dapatkan data berbilang laluan JSON

    akan menggabungkan data berbilang laluan ke dalam tatasusunan dan mengembalikan

    kandungan : id=1

    {"umur": 18, “nama”: “tom”, “skor”: [100, 90, 87], “alamat”: {“bandar”: “Changsha”, “daerah” : “Hunan”}}

    # 得到: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                  |
    +---------------------+
    - Penggunaan ungkapan laluan *

    akan menggabungkan data berbilang laluan ke dalam tatasusunan dan mengembalikan

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

    content: id=3

    {“name ": "tom", "class": {"id": 3, "name": "Class Three a Year"}, "friend": [{"age" : 20, "nama": "kahwin"}, {"umur": 21, "nama": "Bob"}], "alamat": {"bandar": "Changsha", "nama": "Central Park" }}

    # 先插入一条用于测试的数据
    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"}]}')
    - Kembalikan nilai NULL

    kandungan: id=1

    {“umur”: 18, “nama”: “tom”, “skor ”: [100, 90, 87], “alamat ": {"city": "Changsha", "province": "Hunan"}}

    Laluan JSON yang anda cari tidak wujud

    # 获取所有二级嵌套中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"]            |
    +-----------------------------+

    Terdapat NULL dalam laluan

    # age路径不存在,返回NULL
    # 若有多个路径,只要有一个路径存在则不会返回NULL
    select json_extract(content,'$.price') from test_json where id = 1;
    +---------------------------------+
    | json_extract(content,'$.price') |
    +---------------------------------+
    | NULL                            |
    +---------------------------------+

    - Kembalikan ralat

    Jika parameter pertama bukan data jenis JSON, kembalikan ralat

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

    Jika ungkapan laluan tidak diseragamkan, kembali ralat

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

    5 Senario penggunaan

    Fungsi JSON_EXTRACT biasanya digunakan apabila anda ingin mendapatkan data tertentu dalam JSON atau menggunakannya sebagai syarat pertimbangan<.>

    Atas ialah kandungan terperinci Bagaimana untuk menggunakan json_extract dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam