加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何从PostgreSQL中的Json数组中获取元素

发布时间:2020-12-13 16:15:53 所属栏目:百科 来源:网络整理
导读:我已经对此进行了大量搜索,但仍无法回答.我正在使用PostgreSQL.在下面的示例中,列名称为“sections”,列类型为json []. 我的专栏在数据库中看起来像这样: sections[{"name" : "section1","attributes": [{"attrkey1": "value1","attrkey2": "value2"},{"att
我已经对此进行了大量搜索,但仍无法回答.我正在使用PostgreSQL.在下面的示例中,列名称为“sections”,列类型为json [].

我的专栏在数据库中看起来像这样:

sections
[{"name"      : "section1","attributes": [{"attrkey1": "value1","attrkey2": "value2"},{"attrkey3": "value3","attrkey4": "value4"}]
 },{"name"      : "section2","attributes": [{"attrkey3": "value5","attrkey6": "value6"},{"attrkey1": "value7","attrkey8": "value8"}]
 }]

这是json数组,我希望在我的结果中获得“attrkey3”.为了从Json获取特定键,我可以使用json_extract_path_text(json_column,’json_property’),它工作得很好.但我不知道如何从json []获得一些属性.

如果我谈到上面的例子,我想获得属性“attrkey2”的值,以便在我的结果中显示.我知道它是一个数组,所以它可能与平常不同,例如我的数组的所有值都将作为一个不同的行,所以我可能不得不编写子查询,但不知道如何做.

另外,我无法静态编写索引并从某个特定索引获取json元素的属性.我的查询将动态生成,所以我永远不会知道json数组中有多少元素.

我看到了一些静态示例,但在我的情况下不知道如何实现它.有人能告诉我如何在查询中执行此操作吗?

我不确定你有一个json [](json值的PostgreSQL数组)类型列,或者json类型列,它看起来像是一个JSON数组(就像你的例子中一样).

无论哪种情况,您都需要在查询之前扩展阵列.在json []的情况下,你需要使用unnest(anyarray);对于json类型列中的JSON数组,您需要使用json_array_elements(json)(和LATERAL连接 – 它们在我的示例中是隐含的):

select     t.id,each_section ->> 'name' section_name,each_attribute ->> 'attrkey3' attrkey3
from       t
cross join unnest(array_of_json) each_section
cross join json_array_elements(each_section -> 'attributes') each_attribute
where      (each_attribute -> 'attrkey3') is not null; 
-- use "where each_attribute ? 'attrkey3'" in case of jsonb


select     t.id,each_attribute ->> 'attrkey3' attrkey3
from       t
cross join json_array_elements(json_array) each_section
cross join json_array_elements(each_section -> 'attributes') each_attribute
where      (each_attribute -> 'attrkey3') is not null;

SQLFiddle

不幸的是,您不能对数据使用任何索引.您需要先修复架构,才能执行此操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读