Can not find a proper query to format jsonb output in postgres I have a jonb column in a table.
Table: Users id| posts -------- 1 | [{'title': '', 'is_published': '', 'description': '', 'some': 'extra'}, ...] 2 | [{'title': '', 'is_published': '', 'description': '', 'some': 'extra'}, ...]
How do I select the posts column to have just certain fields? Something like:
id| posts -------- 1 | [{'title':'', 'description': ''}, ...] 2 | [{'title':'', 'description': ''}, ...]
Any ideas?
PS: The version of postgres is the latest 12, 13, 14 …
Advertisement
Answer
You may considering using json_to_record_set
to extract your desired columns for each array element in posts before aggregating the results by the user id
to obtain the desired elements.
Query #1
SELECT u.id, json_agg( json_build_object( 'title',p.title, 'description',p.description ) ) as posts FROM users u, json_to_recordset(u.posts) as p( title text, is_published text, description text, some_col text ) GROUP BY u.id ORDER BY u.id;
id | posts |
---|---|
1 | [{“title”:””,”description”:””}] |
2 | [{“title”:””,”description”:””}] |
or shorter
Query #2
SELECT u.id, json_agg(p) as posts FROM users u, json_to_recordset(u.posts) as p( title text, description text ) GROUP BY u.id ORDER BY u.id;
id | posts |
---|---|
1 | [{“title”:””,”description”:””}] |
2 | [{“title”:””,”description”:””}] |
or
Query #3
SELECT u.id, ( SELECT json_agg(p.*) FROM json_to_recordset(u.posts) as p( title text, description text ) ) as posts FROM users u;
Let me know if this works for you.