Can not find a proper query to format jsonb output in postgres I have a jonb column in a table.
x
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.