PostgreSQL查询JSON中的数组

PostgreSQL查询JSON中的数组

1、首先了解-> 和 ->>的区别
-> 返回json格式的数据
->>返回文本格式的数据
2、查询json文件
cont{
          
   "os": "Android",
 "chn": "-1", "dan": 0, 
"sex": 0, 
"file": "lv_statistics", 
"time": "2017-01-23 16:47:54",
 "honor": 0, "chn_id": "-1", 
"is_pay": 0, 
"account": "-1",
 "role_id": -1, 
"battle_id": 1050, 
"game_time": 301, 
"role_name": "-1",
 "battle_name": "-1",
 "battle_type": 4,
 "lv_num_json": [{
          
   "lv": 8,"num": 1},{
          
   "lv": 9,"num": 10}]
}
    查询字段
select cont from student;

在这里插入图片描述

    查询cont中的os
select cont ->> os os from student;
    查询cont中的lv_num_json
select json_array_elements(cont -> lv_num_json) from student;
    查询cont中的lv_num_json中的lv
select json_array_elements(cont -> lv_num_json) -> lv from student;
3、进阶

如果json文件中嵌套着数组,数组中嵌套着json文件,json文件再嵌套着数组,甚至是多层,需要借助json_array_elements来拆分

::json  将其转化为json格式(如果不清楚可以使用pg_typeof()查看)
::json#>> 指向下一层
json_array_elements  将数组中的json文件拆出来

原来的lv_num_json

"lv_num_json": [{
          
   "lv": 8,"num": 1},{
          
   "lv": 9,"num": 10}]

现在将其改为

"lv_num_json":[
        {
          
   
            "lv":[{
          
   "brand":"品牌1","price":"200"},{
          
   "brand":"品牌2","price":"200"}],
            "num":1
        },
        {
          
   
            "lv":[{
          
   "brand":"品牌3","price":"200"},{
          
   "brand":"品牌4","price":"200"}],
            "num":10
        }
    ]

目标:查看lv中的brand信息

分析思路:

1、查看lv_num_json

2、将lv_num_json使用json_array_elements拆出来,并查看是否是json格式,如果不是,将其转化

3、查看lv,并将其使用json_array_elements拆出来

4、查看brand

select name, json_array_elements((json_array_elements((cont :: json#>> {lv_num_json})::json) -> lv)) -> brand from student where id = 2;
经验分享 程序员 微信小程序 职场和发展