patternsqlMajor
Postgres query to return JSON object keys as array
Viewed 0 times
postgresreturnarrayquerykeysjsonobject
Problem
Is it possible to return a JSON object keys as an array of values in PostgreSQL?
In JavaScript, this would simply be
For example, if I have a table like this:
And if there's a row like this:
How can I have a query to return:
In JavaScript, this would simply be
Object.keys(obj), which returns an array of strings.For example, if I have a table like this:
tbl_items
---------
id bigserial NOT NULL
obj json NOT NULLAnd if there's a row like this:
id obj
----- -------------------------
123 '{"foo":1,"bar":2}'How can I have a query to return:
id keys
----- ------------------
123 '{"foo","bar"}'Solution
Sure, with
Or use
This returns an array of keys per row (not for the whole table).
A more verbose form would be to spell out a
json_object_keys(). This returns a set - unlike the JavaScript function Object.keys(obj) you are referring to, which returns an array. Feed the set to an ARRAY constructor to transform it:SELECT id, ARRAY(SELECT json_object_keys(obj)) AS keys
FROM tbl_items;Or use
jsonb_object_keys() for jsonb.This returns an array of keys per row (not for the whole table).
A more verbose form would be to spell out a
LATERAL join instead of the correlated subquery:SELECT t.id, k.keys
FROM tbl_items t
LEFT JOIN LATERAL (SELECT ARRAY(SELECT * FROM json_object_keys(t.obj)) AS keys) k ON true;Code Snippets
SELECT id, ARRAY(SELECT json_object_keys(obj)) AS keys
FROM tbl_items;SELECT t.id, k.keys
FROM tbl_items t
LEFT JOIN LATERAL (SELECT ARRAY(SELECT * FROM json_object_keys(t.obj)) AS keys) k ON true;Context
StackExchange Database Administrators Q#127228, answer score: 29
Revisions (0)
No revisions yet.