Arrays postgresql 9.4或9.5中json对象嵌套数组中的查询元素
我在postgresql数据库中存储了上述格式的json对象。每个对象由关于某个学生的信息和注册信息组成。我在数组中有嵌套数组的复杂对象。我正在尝试选择info数组中的所有元素。我尝试使用以下查询:Arrays postgresql 9.4或9.5中json对象嵌套数组中的查询元素,arrays,json,postgresql,Arrays,Json,Postgresql,我在postgresql数据库中存储了上述格式的json对象。每个对象由关于某个学生的信息和注册信息组成。我在数组中有嵌套数组的复杂对象。我正在尝试选择info数组中的所有元素。我尝试使用以下查询: { "studentID": 1, "StudentName": "jhon", "Data":{ "schoolname":"school1", "enrolmentInfo": [{ "year":"2015
{
"studentID": 1,
"StudentName": "jhon",
"Data":{
"schoolname":"school1",
"enrolmentInfo":
[{
"year":"2015",
"info":
[
{
"courseID":"csc213",
"school":"IT",
"enrollmentdate":"2015-01-01",
"finshdate":"2015-07-01",
"grade": 80 },
{
"courseID":"csc113",
"school":"IT1",
"enrollmentdate":"2015-09-02",
"finshdate":null,
"grade": 90 } ]
},
{
"year":"2014",
"info":
[{
"courseID":"info233",
"school":"IT",
"enrollmentdate":"2014-03-11",
"finshdate":"2014-09-01",
"grade": 81 },
{
"courseID":"csc783",
"school":"IT",
"enrollmentdate":"2014-01-02",
"finshdate":"2014-08-01",
"grade": 87 } ]
} ]
}
}
此查询不起作用,并出现以下错误:无法对标量调用json_数组_元素。是否有任何其他查询可用于提取嵌套数组的元素信息???专门用于。由于您似乎没有使用此库,因此我删除了标记。请提供有效的json值。这一个有多个语法错误,缺少双引号和逗号。你为什么在要求9.4或9.5的时候给[postgres-9.3]加上标签呢?谢谢你,它工作得很好。我有一个小问题:如果数组元素中有另一组元素。例如,courseID:{coursename:computer science,coursecode:csc213},我们如何选择coursename和coursecode?如果你有嵌套的文档,你可以使用->记法-info\u项->'courseID'>>'coursename'我想用信息选择年份,我尝试了这个方法:用信息数据作为选择注册信息->信息作为信息,入学信息->'year'作为jsontesting t的年份,json\u array\u elementst.data->'data'>'enrolmentInfo'作为入学信息选择年份,信息项->>'courseID',信息项->>'school',信息项->'EnrolmentDate',信息项->>'finshdate',信息项->>'grade'来自信息数据idata,json_array_elementsidata.info作为info_项,到_jsonidata.yr作为年份@DmitryThis查询在“info”数组不为空时工作正常,但在某些情况下,我的年份没有信息,但我想要年份。示例:enrolmentInfo:[{year:2015,info:[]}]在本例中,查询不返回年份。如果“info”数组为空,如何返回年份。@Dmitry@R.Y.H你能用额外的JSON结构更新这个问题吗?
with recursive x (info) as (select value->'info' from jsontesting r, json_array_elements(r.data->'Data'->'enrolmentinfo')
UNION ALL
SELECT (e).value->'courseID', (e).value->'school', (e).value->'grade',(e).value->'enrollmentdate', (e).value->'finshdate'
from (select json_each(json_array_elements (info)) e from x) p)
select * from x;
-- assuming that jsontesting.data contains your JSON
WITH info_data AS (
SELECT enrolment_info->'info' AS info
FROM jsontesting t, json_array_elements(t.data -> 'Data' -> 'enrolmentInfo') AS enrolment_info
)
SELECT info_item->>'courseID',
info_item->>'school',
info_item->>'enrollmentdate',
info_item->>'finshdate',
info_item->>'grade'
FROM info_data idata, json_array_elements(idata.info) AS info_item;