当前位置: 首页 > 知识库问答 >
问题:

如何更深层次地查询PostgreSQL嵌套的JSONB?

仲孙雅达
2023-03-14

我是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"}});
------------------------ 
| id | Favorite colors |
------------------------ 
| 1  | blue            |
------------------------ 
| 1  | red             |
------------------------ 
| 3  | blue            |
------------------------ 
| 3  | red             |
------------------------ 
| 3  | green           |
------------------------
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;
SELECT p.id, ((json_array_elements((json_array_elements(p.details::json)::json->>'favorites')::json))::json->>'colors') AS "Favorite colors"
    FROM "person" p;

对此有什么建议吗?

共有1个答案

傅志诚
2023-03-14

您提供的sql查询中存在一些语法错误。如果我正确地猜测了db模式,那么它们应该如下所示:

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
 类似资料:
  • 问题内容: 在PostgreSQL 9.3.4上,我有一个称为“ person”的JSON类型列,并且其中存储的数据为format 。我想检索索引为0的狗的品种。这是我运行的两个查询: 不起作用 作品 为什么必须进行类型转换?效率低下吗?我是在做错什么,还是对Postgres JSON支持有必要? 问题答案: 这是因为运算符将JSON数组元素获取为文本。您需要强制转换以将其结果转换回JSON。 您

  • 在PostgreSQL 9.3.4中,我有一个名为“person”的JSON类型列,其中存储的数据格式为

  • 问题内容: 一个作业有一个真正的问题(和头痛)… 我在入门编程班上,我必须写一个函数,给定一个列表,该函数将返回其达到的“最大”深度。例如:[1,2,3]将返回1,[ 1,[2,3]]将返回2 … 我已经编写了这段代码(这是我能得到的最好的T_T) 但是,它显然不像应有的那样工作,因为如果存在不计入最大深度的列表,它仍然会增加计数器… 例如:当我将函数与[1,2,[3,4],5,[6],7]一起使

  • 我正在构建一个搜索查询,它将一组约束()动态地添加到查询中。一般预期结构如下 换句话说,我有一组(一个或多个)必须全部满足的条件(上面的)。可能有几个这样的集合,其中任何一个都足以进行最后的匹配(上面的)。 这种结构的一个示例,由我的代码生成(这是完整的API查询,生成的部分是): 我对这个查询的理解是: 如果和 或 如果 条目将匹配 不幸的是,我把Elasticsearch称为错误 这个错误是什

  • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 我有以下三张桌子 教室 注册学生 iduser_idclass_id 帖子 模型 Classroom.php 注册学生。php 邮递php 现在我需要获得某个班级的所有帖子,学生在该班级注册。 例如,一名学生注册了教室表中id号为1的班级。所以在registered_students表中会注意到,这个特定的用户是在这个特定的类下注册的。每个类在post表中可能有多个post。用户需要获得他类的所有