如何从 PostgreSQL 中的 Json 数组中获取元素
How to get elements from Json array in PostgreSQL
我对此进行了很多搜索,但仍然无法回答。我正在使用 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)
; in case of JSON arrays in a json
typed column, you need to use json_array_elements(json)
(and 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;
很遗憾,您不能对数据使用任何索引。为此,您需要先修复架构。
而且,如果 array
中有键值映射数据:
select each_data -> 'value' as value3
from t cross join jsonb_array_elements(t.sections -> 'attributes') each_attribute
where each_attribute -> 'key' = '"attrkey3"'
我提到这个是因为这个很好的答案也为我的案例提供了一个完美的解决方案。顺便说一下,还要注意 jsonb_array
.. jsonb
类型属性的方法。
如果您想访问单个元素,请使用 json_array -> index
例如,如果您有 json_arr=[1,2,3]
,那么 json_array -> 0
将 return 1
我对此进行了很多搜索,但仍然无法回答。我正在使用 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)
; in case of JSON arrays in a json
typed column, you need to use json_array_elements(json)
(and 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;
很遗憾,您不能对数据使用任何索引。为此,您需要先修复架构。
而且,如果 array
中有键值映射数据:
select each_data -> 'value' as value3
from t cross join jsonb_array_elements(t.sections -> 'attributes') each_attribute
where each_attribute -> 'key' = '"attrkey3"'
我提到这个是因为这个很好的答案也为我的案例提供了一个完美的解决方案。顺便说一下,还要注意 jsonb_array
.. jsonb
类型属性的方法。
如果您想访问单个元素,请使用 json_array -> index
例如,如果您有 json_arr=[1,2,3]
,那么 json_array -> 0
将 return 1