6

Below is a json data in a column name meta and table name layer. Here i retrieve data of 'pages' key by meta->'pages' but i have no idea how to get 'lable' key value which is an array element of 'fields' which is again in an array pages.

{
   "id":1,
   "name":"org_details",
   "action":"organisation.php",
   "lable":"Manage Organisation",
   "pages":[
      {
         "name":"Create Org",
         "lable":"Organisation Name",
         "fields":[
            {
               "id":11,
               "type":1,
               "subtype":1,
               "lable":"Organisation Name"
            },
            {
               "id":12,
               "type":2,
               "subtype":1,
               "lable":"Description",
               "mandatory":TRUE,
               "validations":{
                  "minl":2,
                  "maxl":60
               }
            },
            {
               "id":13,
               "type":3,
               "subtype":1,
               "lable":"Org. Type",
               "default value":1,
               "mandatory":TRUE,
               "choices":[
                  {
                     "lable":"OFSDP",
                     "value":1
                  },
                  {
                     "lable":"AGRICULTURE",
                     "value":2
                  },
                  {
                     "lable":"HUTICULTURE",
                     "value":3
                  }
               ]
            },
            {
               "id":14,
               "type":4,
               "lable":"checkbox",
               "default value":1
            },
            {
               "id":15,
               "type":5,
               "subtype":1,
               "lable":"Upload",
               "mandatory":TRUE
            },
            {
               "id":16,
               "type":6,
               "subtype":1,
               "lable":"GIS"
            },
            {
               "id":17,
               "type":7,
               "subtype":1,
               "lable":"Date"
            },
            {
               "id":18,
               "type":8,
               "lable":"Attachment"
            }
         ]
      }
   ]
}
3
  • Postgre documentation is some of the best i've seen. JSON page here. postgresql.org/docs/current/static/functions-json.html Commented Aug 16, 2017 at 9:28
  • yes i read those but can't get it. Commented Aug 16, 2017 at 9:38
  • My postgres doesn't accept TRUE, had to replace it with "TRUE" or true Commented Aug 16, 2017 at 9:39

3 Answers 3

6

One way with json_array_elements:

(assuming that your table is your_table and json column name is meta)

select j.value->>'lable'
from your_table
join lateral json_array_elements(meta->'pages'->0->'fields') j
on true
Sign up to request clarification or add additional context in comments.

Comments

3

You can index an array by number:

select meta::jsonb->'pages'->0->'lable'
from   layer

To retrieve the "lables" of all organisations, create a table with jsonb_to_recordset:

select  orgs.lable
from    layer
cross join
        jsonb_to_recordset(meta::jsonb->'pages') orgs(name text, lable text)

The second argument to jsonb_to_recordset defines the columns you are interested in. Here I'm using orgs(name text, lable text) to make the name and lable available.

To get the value of a nested JSON dictionary, you can use a lateral join:

select  orgs.lable
,       fields.lable
from    layer
cross join
        jsonb_to_recordset(meta::jsonb->'pages')
            orgs(lable text, fields jsonb)
cross join
        jsonb_to_recordset(fields) fields(lable text)

Working example at regtester.

3 Comments

want to retrieve values : Organisation Name, Description, Org. Type, checkbox, Upload, GIS, Date, Attachment
what do you mean by <your json here>
Replaced <your json here> with a select on the layer table
1
select '[
{
            "item_type"       : "FEE"
            ,"item_id": 18
            , "item_status"     : "PENDING"
            , "description"          : "auto_pay"
}
]'::json->0->>'item_id' as item_id;

 item_id 
--------------
 18

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.