I have column "elements" in table which is having a json(array json) row values which looks like this
| elements |
|---|
| [{"key":12,"value":"qw"},{"key":13,"value":"fa"}] |
| [{"key":32,"value":"24"},{"key":321,"value":"21"}] |
I want to make an column of arrays for every row which consist of keys extracted from that row's json values ,my desired column "result" may look like this
| elements | result |
|---|---|
| [{"key":12,"value":"qw"},{"key":13,"value":"fa"}] | {12,13} |
| [{"key":32,"value":"24"},{"key":321,"value":"21"}] | {32,321} |
is there a way to do it? thank you
CodePudding user response:
Schema (PostgreSQL v13)
CREATE TABLE test (
elements json
);
INSERT INTO test VALUES ('[{"key":12,"value":"qw"},{"key":13,"value":"fa"}]');
INSERT INTO test VALUES ('[{"key":32,"value":"24"},{"key":321,"value":"21"}]');
Query #1
select elements::text, array_agg(cast(value->>'key' as integer)) as result
from test, json_array_elements(elements)
group by 1
ORDER BY 1;
| elements | result |
|---|---|
| [{"key":12,"value":"qw"},{"key":13,"value":"fa"}] | 12,13 |
| [{"key":32,"value":"24"},{"key":321,"value":"21"}] | 32,321 |
CodePudding user response:
select elements::text,
array_agg(value->>'key')
from your_table, json_array_elements(elements)
group by 1;
