web-dev-qa-db-ja.com

JSONオブジェクトキーを配列として返すPostgresクエリ

JSONオブジェクトキーをPostgreSQLの値の配列として返すことはできますか?

JavaScriptでは、これは単にObject.keys(obj)であり、文字列の配列を返します。

たとえば、次のようなテーブルがあるとします。

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

そして、このような行がある場合:

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

返すクエリを作成するにはどうすればよいですか。

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

もちろん、 json_object_keys() を使用します。これは、setを返します-参照しているJavaScript関数Object.keys(obj)とは異なり、array。セットを ARRAYコンストラクタ にフィードして変換します。

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

または、jsonbjsonb_object_keys() を使用します。

これは、行ごとにキーの配列を返します(テーブル全体ではありません)。

より冗長な形式は、相関サブクエリの代わりにLATERAL結合を綴ることです:

_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