如何提取 JSONB 数组的元素?

axa*_*xay 5 arrays postgresql aggregate-functions jsonb postgresql-10

运行 PostgresSQL v10.5。

在我的表中有一个类型为 的table_a列。metadatajsonb

它有一个 JSON 数组作为其键之一,array_key其值如下所示:

[{"key1":"value11", "key2":"value21", "key3":"value31"}, 
 {"key1":"value21", "key2":"value22", "key3":"value23"}]
Run Code Online (Sandbox Code Playgroud)

这就是我查询这个密钥的方式

SELECT metadata->>'array_key' from table_a
Run Code Online (Sandbox Code Playgroud)

这给了我整个数组。有什么方法可以只查询选定的键并可能格式化它们?

数组的类型是文本,pg_typeof(metadata->>'array_key')text

理想的输出是

"value11, value13", "value21, value23"
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

用于获取可以按键过滤的jsonb_array_elements()数组元素(如):value

select value->>'key1' as key1, value->>'key3' as key3
from table_a
cross join jsonb_array_elements(metadata->'array_key');

  key1   |  key3   
---------+---------
 value11 | value31
 value21 | value23
(2 rows)
Run Code Online (Sandbox Code Playgroud)

使用聚合将每行的输出作为单个值,例如:

select string_agg(concat_ws(', ', value->>'key1', value->>'key3'), '; ')
from table_a
cross join jsonb_array_elements(metadata->'array_key')
group by id;

             string_agg             
------------------------------------
 value11, value31; value21, value23
(1 row)
Run Code Online (Sandbox Code Playgroud)

rextester 中的工作示例。