Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine two JSON objects in PostgreSQL

Tags:

postgresql

I have two JSON rows in a PostgreSQL 9.4 table:

      the_column      
----------------------
 {"evens": [2, 4, 6]}
 {"odds": [1, 3, 5]}

I want to combine all of the rows into one JSON object. (It should work for any number of rows.)

Desired output:

{"evens": [2, 4, 6], "odds": [1, 3, 5]}

like image 320
Travis Avatar asked Oct 28 '15 23:10

Travis


2 Answers

Use json_agg() to get an array:

SELECT json_agg(source_column) AS the_column    
FROM   tbl;

Or json_each() in a LATERAL join and json_object_agg() to assemble elements:

SELECT json_object_agg(key, value) AS the_column
FROM   tbl, json_each(data);
like image 91
Erwin Brandstetter Avatar answered Oct 12 '22 17:10

Erwin Brandstetter


FYI, if someone's using jsonb in >= 9.5 and they only care about top-level elements being merged without duplicate keys, then it's as easy as using the || operator:

select '{"evens": [2, 4, 6]}'::jsonb || '{"odds": [1, 3, 5]}'::jsonb;
            ?column?                 
-----------------------------------------
{"odds": [1, 3, 5], "evens": [2, 4, 6]}
(1 row)
like image 24
Arthur Nascimento Avatar answered Oct 12 '22 16:10

Arthur Nascimento