Postgres 查询以将 JSON 对象键作为数组返回

Yan*_*hon 8 postgresql array json postgresql-9.4

是否可以将 JSON 对象键作为 PostgreSQL 中的值数组返回?

在 JavaScript 中,这只是Object.keys(obj),它返回一个字符串数组。

例如,如果我有一张这样的表:

tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL
Run Code Online (Sandbox Code Playgroud)

如果有这样的一行:

id      obj
-----   -------------------------
123     '{"foo":1,"bar":2}'
Run Code Online (Sandbox Code Playgroud)

我怎样才能有一个查询返回:

id      keys
-----   ------------------
123     '{"foo","bar"}'
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 16

当然,与json_object_keys(). 这将返回一个set - 与Object.keys(obj)您所指的 JavaScript 函数不同,它返回一个array。将集合提供给ARRAY构造函数以对其进行转换:

SELECT id, ARRAY(SELECT json_object_keys(obj)) AS keys
FROM   tbl_items;
Run Code Online (Sandbox Code Playgroud)

jsonb_object_keys()用于jsonb.

这将返回每行的键数组(不是整个表)。

更详细的形式是拼出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;
Run Code Online (Sandbox Code Playgroud)