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

我已经对此进行了大量搜索,但仍然无法回答.我正在使用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[](PostgreSQL数组json值)类型列,或一个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_section ->> 'name' section_name,
           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

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

如果您想访问单个元素,请使用json_array -> index

例如,如果你有json_arr=[1,2,3]thenjson_array -> 0将返回 1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值