如何在更深层次上查询PostgreSQL嵌套JSONB?

时间:2017-09-18 09:20:59

标签: postgresql postgresql-9.4 jsonb

我是JSON / JSONB数据类型的新手,我在从更深层次选择JSONB元素时遇到了一些问题。

以下是一个示例表:

CREATE TABLE person (id integer, details jsonb);

INSERT INTO person (id, details) VALUES
("id": 1, {"favorites":{"colors":"blue", "colors":"red"}}),
("id": 2),
("id": 3, {"favorites":{"colors":"blue", "colors":"red", "colors":"green"}});


我想选择所有p.details - >'收藏夹' - >>'colors',例如:

------------------------ 
| id | Favorite colors |
------------------------ 
| 1  | blue            |
------------------------ 
| 1  | red             |
------------------------ 
| 3  | blue            |
------------------------ 
| 3  | red             |
------------------------ 
| 3  | green           |
------------------------


以下(或类似)给出了喜欢的颜色的空列(也尝试使用jsonb_array_elements):

SELECT p.id, p.details ->'favorites' ->>'colors' AS "Favorite colors"
FROM "person" p;

SELECT p.id, json_array_elements((p.details ->'favorites' ->>'colors')::json) AS "Favorite colors"
FROM "person" p;


以下内容适用于简单查询,但在检索更多数据时会崩溃浏览器(最终用户在Web浏览器中使用查询)。

SELECT p.id, ((json_array_elements((json_array_elements(p.details::json)::json->>'favorites')::json))::json->>'colors') AS "Favorite colors"
    FROM "person" p;

似乎浏览器耗费了大量内存。我发现一些帖子说多次调用json_array_elements会降低查询速度:https://www.postgresql.org/message-id/52EEEC37.9040305@2ndquadrant.com

对此有何建议?

1 个答案:

答案 0 :(得分:0)

您提供的SQL查询中存在一些语法错误。 如果我正确猜到了数据库模式,那么它应该是这样的:

DROP TABLE person;
CREATE TABLE person (id integer, details jsonb);

INSERT INTO person (id, details) VALUES
(1, '{"favorites":[{"colors":"blue"}, {"colors":"red"}]}'::jsonb),
(2, '{}'::jsonb),
(3, '{"favorites":[{"colors":"blue"}, {"colors":"red"}, {"colors":"green"}]}'::jsonb);

如果这是正确的,您可以通过以下方式获得结果:

select id, jsonb_array_elements(details->'favorites')->'colors' from person