it-swarm.com.de

Postgres-Abfrage zur Rückgabe von JSON-Objektschlüsseln als Array

Ist es möglich, einen JSON-Objektschlüssel als Array von Werten in PostgreSQL zurückzugeben?

In JavaScript wäre dies einfach Object.keys(obj), das ein Array von Zeichenfolgen zurückgibt.

Zum Beispiel, wenn ich eine Tabelle wie diese habe:

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

Und wenn es eine Reihe wie diese gibt:

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

Wie kann ich eine Abfrage zurückgeben:

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

Sicher, mit json_object_keys() . Dies gibt eine Menge zurück - im Gegensatz zu der JavaScript-Funktion Object.keys(obj), auf die Sie sich beziehen, die eine Array . Füttere die Menge einem ARRAY Konstruktor , um sie zu transformieren:

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

Oder verwenden Sie jsonb_object_keys() für jsonb.

Dies gibt ein Array von Schlüsseln pro Zeile zurück (nicht für die gesamte Tabelle).

Eine ausführlichere Form wäre, einen LATERAL Join anstelle der korrelierten Unterabfrage zu buchstabieren:

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