web-dev-qa-db-fra.com

Requête Postgres pour renvoyer les clés d'objet JSON sous forme de tableau

Est-il possible de renvoyer une clé d'objet JSON sous forme de tableau de valeurs dans PostgreSQL?

En JavaScript, ce serait simplement Object.keys(obj), qui retourne un tableau de chaînes.

Par exemple, si j'ai une table comme celle-ci:

tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL

Et s'il y a une rangée comme celle-ci:

id      obj
-----   -------------------------
123     '{"foo":1,"bar":2}'

Comment puis-je avoir une requête à retourner:

id      keys
-----   ------------------
123     '{"foo","bar"}'
6
Yanick Rochon

Bien sûr, avec json_object_keys() . Cela renvoie un ensemble - contrairement à la fonction JavaScript Object.keys(obj) à laquelle vous faites référence, qui renvoie un tableau . Alimentez l'ensemble à un constructeur ARRAY pour le transformer:

SELECT id, ARRAY(SELECT json_object_keys(obj)) AS keys
FROM   tbl_items;

Ou utilisez jsonb_object_keys() pour jsonb.

Cela renvoie un tableau de clés par ligne (pas pour la table entière).

Une forme plus détaillée consisterait à épeler une jointure LATERAL au lieu de la sous-requête corrélée:

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;
12
Erwin Brandstetter