【问题标题】:Query elements in a nested array of a json object in postgresql 9.4 or 9.5在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素
【发布时间】:2016-03-04 21:19:12
【问题描述】:
{
  "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 对象存储在 postgresql 数据库中。每个对象都包含有关某个学生的信息以及注册信息。我在数组中有嵌套数组的复杂对象。我正在尝试选择“信息”数组中的所有元素。我尝试使用以下查询:

 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;

此查询不起作用,它给出以下错误:“无法在标量上调用 json_array_elements”。是否有任何其他查询可用于提取嵌套数组“info”的元素??

【问题讨论】:

  • json.net 专门用于.Net library Json.NET。由于您似乎没有使用此库,因此我删除了标签。
  • 请提供一个有效的 json 值。这个有多个语法错误,缺少双引号和逗号 AFAICS。为什么在要求 9.4 或 9.5 时标记 [postgres-9.3]?

标签: arrays json postgresql


【解决方案1】:
-- 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;

【讨论】:

  • 谢谢,它运行良好。我有一个小问题:如果我们在数组元素内部有另一组元素。比如 courseID:{ coursename:"computer science", coursecode:"csc213" },怎么选择coursename和coursecode??
  • 如果你有嵌套文档,你可以使用-> notation - info_item ->'courseID'->>'coursename'
  • 我想用信息选择年份,我试过这个: WITH info_data AS ( SELECT enrolment_info->'info' AS info, enrolment_info->'year' as yr FROM jsontesting t, json_array_elements(t .data -> 'Data' -> 'enrolmentInfo') AS enrolment_info ) 选择年份,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, to_json(idata.yr) as years; @德米特里
  • 当“info”数组不为空时,此查询工作正常,但在某些情况下,我的年份没有信息,但我想要年份。示例: "enrolmentInfo":[{ "year":"2015", "info": []}] 在这种情况下,查询不返回年份。如果“信息”数组为空,我如何返回年份。@ Dmitry
  • @R.Y.H 你能用额外的 JSON 结构更新问题吗?
猜你喜欢
  • 2017-04-26
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多