简体   繁体   English

从 Postgres JSON 列中仅获取少数属性

[英]Get only few properties from Postgres JSON column

I have stored JSON data as TEXT in PostgreSQL column.我已将JSON数据作为TEXT存储在 PostgreSQL 列中。 Below is the format:下面是格式:

{"employee":[{"name":"Sunil","ph":["90","23"],"age":34},
             {"name":"Abhi","ph":["91","24"],"age":36},
             {"name":"Arnav","ph":["95","26"],"age":36}],
 "student":[{"name":"Anil","ph":["93","26"],"age":34}],
 "Admin":{"name":"Admin","ph":["90","23"],"age":36}}

Out of these properties i want to select only few fields and i am looking something like在这些属性中,我想 select 只有几个字段,我看起来像

select (value::jsonb,['name','age'])  as jsondata from details  where c.details_id =5

And output like:和 output 一样:

{"employee":[{"name":"Sunil","age":34},{"name":"Abhi","age":36},{"name":"Arnav","age":36}],"student":[{"name":"Anil","age":34}],"Admin":{"name":"Admin","age":36}}

There are multiple fields in the JSON array but I want to select only these two. JSON数组中有多个字段,但我只想 select 这两个字段。 Similar to skip_nulls I am looking for something like retain_only(jsondata,['name','age']) .类似于skip_nulls我正在寻找类似retain_only(jsondata,['name','age'])东西。

You can use jsonb_object_agg with a cross join :您可以将jsonb_object_aggcross join一起使用:

select jsonb_object_agg(v.key, case when jsonb_typeof(v.value) = 'object' 
   then jsonb_build_object('name', v.value -> 'name', 'age', v.value -> 'age') 
   else (select jsonb_agg(jsonb_build_object('name', v1.value -> 'name', 
            'age', v1.value -> 'age')) 
          from jsonb_array_elements(v.value) v1) end) 
from tbl t cross join jsonb_each(t.js::jsonb) v

See fiddle .见小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM