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
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;
id | content |
---|---|
1 | {“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}} |
2 | [1, “apple”, “red”, {“age”: 18, “name”: “tom”}] |
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"}]');
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:- Dapatkan kandungan dalam data JSON Nested Digabungkan dengan dua kaedah pemerolehan yang diperkenalkan sebelum ini, anda boleh mendapatkan data bersarang dalam data json[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
kandungan: id =14. Menjadi lebih baik dan lebih baik- Dapatkan data berbilang laluan JSON akan menggabungkan data berbilang laluan ke dalam tatasusunan dan mengembalikan{"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
kandungan : id=1- Penggunaan ungkapan laluan * akan menggabungkan data berbilang laluan ke dalam tatasusunan dan mengembalikan{"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
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- Kembalikan nilai NULL{“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
kandungan: id=1Laluan JSON yang anda cari tidak wujud{“umur”: 18, “nama”: “tom”, “skor ”: [100, 90, 87], “alamat ": {"city": "Changsha", "province": "Hunan"}}
# 获取所有二级嵌套中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"] | +-----------------------------+
# age路径不存在,返回NULL # 若有多个路径,只要有一个路径存在则不会返回NULL select json_extract(content,'$.price') from test_json where id = 1; +---------------------------------+ | json_extract(content,'$.price') | +---------------------------------+ | NULL | +---------------------------------+
# 存在任意路径为NULL则返回NULL select json_extract(content,'$.age',NULL) from test_json where id = 1; +------------------------------------+ | json_extract(content,'$.age',NULL) | +------------------------------------+ | NULL | +------------------------------------+
select json_extract('{1,2]',$[0])
Atas ialah kandungan terperinci Bagaimana untuk menggunakan json_extract dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!