我是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
对此有何建议?
答案 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