Reputation: 43
I have a users table with columns like id
, name
, email
, etc. I want to retrieve information of some users in the following format in a single json object:
{
"userId_1" : {"name" : "A", "email": "[email protected]"},
"userId_2" : {"name" : "B", "email": "[email protected]"}
}
Wherein the users unique id
is the key and a json containing his information is its corresponding value.
I am able to get this information in two separate rows using json_build_object
but I would want it get it in a single row in the form of one single json object.
Upvotes: 4
Views: 7686
Reputation: 181
Try this:
SELECT json_object(array_agg(id), array_agg(json::text)) FROM (
SELECT id, json_build_object('name', name, 'email', email) as json
FROM users_table
) some_alias_name
If your id is not of text type then you have to cast it to text too.
Upvotes: 1
Reputation: 222432
You can use json aggregation functions:
select jsonb_object_agg(id, to_jsonb(t) - 'id') res
from mytable t
jsonb_object_agg()
aggregates key/value pairs into a single object. The key is the id
of each row, and the values is a jsonb object made of all columns of the table except id
.
Sample data:
id | name | email :------- | :--- | :---------- userid_1 | A | [email protected] userid_2 | B | [email protected]
Results:
| res | | :----------------------------------------------------------------------------------------------------- | | {"userid_1": {"name": "A", "email": "[email protected]"}, "userid_2": {"name": "B", "email": "[email protected]"}} |
Upvotes: 9
Reputation: 2003
try -
select row_to_json(col) from T
link below might help https://hashrocket.com/blog/posts/faster-json-generation-with-postgresql
Upvotes: 1