Bagaimana untuk menggunakan json_extract dalam mysql

WBOY
Lepaskan: 2023-05-31 16:58:16
ke hadapan
1797 orang telah melayarinya

    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;
    Salin selepas log masuk
    rrree
    idcontent
    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"}]');
    Salin selepas log masuk

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

    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"}]}')
    Salin selepas log masuk
    - 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"]            |
    +-----------------------------+
    Salin selepas log masuk

    Terdapat NULL dalam laluan

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

    - 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                               |
    +------------------------------------+
    Salin selepas log masuk

    Jika ungkapan laluan tidak diseragamkan, kembali ralat

    select json_extract('{1,2]',$[0])
    Salin selepas log masuk
    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!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan