MySQL自5.7之后开始支持json类型,相应的解析函数主要是json_extract();
查询sql版本:select version();
JSON_EXTRACT()函数用于从JSON中提取元素,例如:
列名:info
{"Info1":[[{"id":1,"name":"aaa","grade":["{\"china\":100,\"engine\":[\"95\"],\"match\":[\"99\"]}"]}]]}
select json_extract(info, '$.Info1') from table1;
[[{"id":1,"name":"aaa","grade":["{\"china\":100,\"engine\":[\"95\"],\"match\":[\"99\"]}"]}]]
select json_extract(info, '$.Info1[0][0]') from table1;
{"id":1,"name":"aaa","grade":["{\"china\":100,\"engine\":[\"95\"],\"match\":[\"99\"]}"]}
如果要对解析过后的json继续解析,则在上一步基础上嵌套json_extract()
select json_extract(json_extract(info, '$.Info1[0][0]'),'$.grade[0]') from table1;
{"china":100,"engine":["95"],"match":["99"]}
--------------------------------------------------------------------------------
json_extract的等效操作符是->;
json_unquote(json_extract())的等效操作符是->>;
--------------------------------------------------------------------------------
用法解析
‘$.*’ 返回全部json
‘$.title’ 返回key=”title”的数据
‘$**.text’ 返回所有最底层key=”text”的数据
‘$.content[*].item1[*]’ 返回key=content的list的key=item1的list的所有内容
--------------------------------------------------------------------------------
与其它数据库的类似函数(如oradle的json_value)相比,当json的值是字符类型时,json_extract的结果略有不同。
在MySql中,是这样的:
而在Oracle中,是这样的:
可见,差别在于MySql的json_extract的返回值会带上两个双引号。
而当json的值是数值型时,没有差别。
为保持各种情况下的一致,在MySql中要解析json,还需再加上json_unquote函数以去掉双引号: