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;