MySQL中json字段的操作方法

吾爱主题 阅读:192 2024-04-01 23:50:58 评论:0

   MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:

还是从例子看起:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mysql> create table test1(id int ,info json); Query OK, 0 rows affected (0.02 sec)   mysql> insert into test1 values (1, '{"name":"yeyz","age":26}' ),(2, '{"name":"zhangsan","age":30}' ),(3, '{"name":"lisi","age":35}' ); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0   mysql> select * from test1; + ------+---------------------------------+ | id  | info              | + ------+---------------------------------+ |  1 | { "age" : 26, "name" : "yeyz" }   | |  2 | { "age" : 30, "name" : "zhangsan" } | |  3 | { "age" : 35, "name" : "lisi" }   | + ------+---------------------------------+ 3 rows in set (0.00 sec)

    首先我们创建了一个表test1,其中id是int字段,info是json字段,插入了三条数据,如上:

?
1 2 3 4 5 6 7 8 mysql> select * from test1 where json_extract(info, "$.age" )>=30; + ------+---------------------------------+ | id  | info              | + ------+---------------------------------+ |  2 | { "age" : 30, "name" : "zhangsan" } | |  3 | { "age" : 35, "name" : "lisi" }   | + ------+---------------------------------+ 2 rows in set (0.00 sec)

   我们可以通过json_extract的方法得到json中的内容。其中:

1、$符号代表的是json的根目录,

2、我们使用$.age相当于取出来了json中的age字段,

3、当然,在函数最前面,应该写上字段名字info

下面来看json中常用的函数:

a、json_valid判断是否是json字段,如果是,返回1,如果不是,返回0

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 mysql> select json_valid(2); + ---------------+ | json_valid(2) | + ---------------+ |       0 | + ---------------+ 1 row in set (0.01 sec) mysql> select json_valid( '{"num":2}' ); + -------------------------+ | json_valid( '{"num":2}' ) | + -------------------------+ |            1 | + -------------------------+ 1 row in set (0.00 sec)   mysql> select json_valid( '2' ); + -----------------+ | json_valid( '2' ) | + -----------------+ |        1 | + -----------------+ 1 row in set (0.00 sec) mysql> select json_valid( 'name' ); + --------------------+ | json_valid( 'name' ) | + --------------------+ |         0 | + --------------------+ 1 row in set (0.00 sec)

   这里需要注意的是,如果传入了字符串2,那么,返回结果是1

b、json_keys传回执行json字段最上一层的key值

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mysql> select json_keys( '{"name":"yeyz","score":100}' ); + ------------------------------------------+ | json_keys( '{"name":"yeyz","score":100}' ) | + ------------------------------------------+ | [ "name" , "score" ]            | + ------------------------------------------+ 1 row in set (0.01 sec) mysql> select json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' ); + ----------------------------------------------------------------+ | json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' ) | + ----------------------------------------------------------------+ | [ "name" , "score" ]                       | + ----------------------------------------------------------------+ 1 row in set (0.00 sec) #如果有多层,可以在最后面使用$的方法,拿到其中的某一层的目录 mysql> select json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' , '$.score' ); + --------------------------------------------------------------------------+ | json_keys( '{"name":"yeyz","score":{"math":100,"English":95}}' , '$.score' ) | + --------------------------------------------------------------------------+ | [ "math" , "English" ]                           | + --------------------------------------------------------------------------+ 1 row in set (0.00 sec)

c、json_length函数,返回最上一层的key个数,如果想取到中间的某一层,则可以使用$的方法,如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> select json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ); + ---------------------------------------------------------------------------+ | json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ) | + ---------------------------------------------------------------------------+ |                                     3 | + ---------------------------------------------------------------------------+ 1 row in set (0.00 sec)   mysql> select json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' , '$.score' ); + -------------------------------------------------------------------------------------+ | json_length( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' , '$.score' ) | + -------------------------------------------------------------------------------------+ |                                          2 | + -------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

d、json_depth函数,json文件的深度,测试例子如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> select json_depth( '{"aaa":1}' ),json_depth( '{}' ); + -------------------------+------------------+ | json_depth( '{"aaa":1}' ) | json_depth( '{}' ) | + -------------------------+------------------+ |            2 |        1 | + -------------------------+------------------+ 1 row in set (0.00 sec)   mysql> select json_depth( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ); + --------------------------------------------------------------------------+ | json_depth( '{"name":"yeyz","score":{"math":100,"English":95},"age":26}' ) | + --------------------------------------------------------------------------+ |                                    3 | + --------------------------------------------------------------------------+ 1 row in set (0.00 sec)

   这里需要注意的是,形如{'aa':1}这种形式的json,其深度是2

e、json_contains_path函数检索json中是否有一个或者多个成员。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 mysql> set @j= '{"a":1,"b":2,"c":{"d":4}}' ; Query OK, 0 rows affected (0.00 sec) #one的意思是只要包含一个成员,就返回1 mysql> select json_contains_path(@j, 'one' , '$.a' , '$.e' ); + ------------------------------------------+ | json_contains_path(@j, 'one' , '$.a' , '$.e' ) | + ------------------------------------------+ |                    1 | + ------------------------------------------+ 1 row in set (0.00 sec) # all 的意思是所有的成员都包含,才返回1 mysql> select json_contains_path(@j, 'all' , '$.a' , '$.e' ); + ------------------------------------------+ | json_contains_path(@j, 'all' , '$.a' , '$.e' ) | + ------------------------------------------+ |                    0 | + ------------------------------------------+ 1 row in set (0.01 sec)   mysql> select json_contains_path(@j, 'one' , '$.c.d' ); + --------------------------------------+ | json_contains_path(@j, 'one' , '$.c.d' ) | + --------------------------------------+ |                  1 | + --------------------------------------+ 1 row in set (0.00 sec)   mysql> select json_contains_path(@j, 'one' , '$.a.d' ); + --------------------------------------+ | json_contains_path(@j, 'one' , '$.a.d' ) | + --------------------------------------+ |                  0 | + --------------------------------------+ 1 row in set (0.00 sec)

f、json_type函数,判断json中的成员的类型,需要和json_extract结合起来使用。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 mysql> select * from test1; + ------+---------------------------------+ | id  | info              | + ------+---------------------------------+ |  1 | { "age" : 26, "name" : "yeyz" }   | |  2 | { "age" : 30, "name" : "zhangsan" } | |  3 | { "age" : 35, "name" : "lisi" }   | + ------+---------------------------------+ 3 rows in set (0.00 sec) #判断 name 的类型 mysql> select json_type(json_extract(info, "$.name" )) from test1; + ----------------------------------------+ | json_type(json_extract(info, "$.name" )) | + ----------------------------------------+ | STRING                 | | STRING                 | | STRING                 | + ----------------------------------------+ 3 rows in set (0.00 sec) #判断age的类型 mysql> select json_type(json_extract(info, "$.age" )) from test1; + ---------------------------------------+ | json_type(json_extract(info, "$.age" )) | + ---------------------------------------+ | INTEGER                | | INTEGER                | | INTEGER                | + ---------------------------------------+ 3 rows in set (0.00 sec) #判断 name 和age组合起来的类型,可以看到是array mysql> select json_type(json_extract(info, "$.name" , "$.age" )) from test1; + ------------------------------------------------+ | json_type(json_extract(info, "$.name" , "$.age" )) | + ------------------------------------------------+ | ARRAY                     | | ARRAY                     | | ARRAY                     | + ------------------------------------------------+ 3 rows in set (0.00 sec)

g、*的作用,所有的值,看下面的例子。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 {   "a" :1,   "b" :2,   "c" :     {      "d" :4     }   "e" :     {     "d" :       {       "ddd" :       "5"       }     } } mysql> set @j= '{"a":1,"b":2,"c":{"d":4},"e":{"d":{"ddd":"5"}}}' ; Query OK, 0 rows affected (0.00 sec) #所有成员 mysql> select json_extract(@j, '$.*' ); + ---------------------------------------+ | json_extract(@j, '$.*' )        | + ---------------------------------------+ | [1, 2, { "d" : 4}, { "d" : { "ddd" : "5" }}] | + ---------------------------------------+ 1 row in set (0.00 sec) #所有成员中的d成员 mysql> select json_extract(@j, '$.*.d' ); + --------------------------+ | json_extract(@j, '$.*.d' ) | + --------------------------+ | [4, { "ddd" : "5" }]    | + --------------------------+ 1 row in set (0.00 sec)

以上就是MySQL中json字段的操作方法的详细内容,更多关于MySQL json字段的资料请关注服务器之家其它相关文章!

原文链接:https://cloud.tencent.com/developer/article/1558311

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容