我的Postgres 9.6数据库中有一个JSONB列,大致具有以下结构
[
{
"A": "some value",
"B": "another value",
"foo": "bar",
"x": "y"
},
{
"B": "abc",
"C": "asdf"
}
]
它始终是一个对象数组,数组元素的数量各不相同。一些对象键位于每个数组元素中,但不是全部。真实物体有更多的钥匙,几百个是常见的。
在某些情况下,我需要为每个数组元素获取特定键的值。例如,如果我想访问键“B”,结果应为
["another value", "abc"]
如果我访问“foo”,结果应为
["bar", null]
是否有一种合理有效的方法来获取SQL查询中特定键的所有值?它应该独立于数组中的对象数量而工作,理想情况下,如果对象中的键数量变得更大,它应该不会变慢。
答案 0 :(得分:1)
您可以使用jsonb_array_elements
提取每个对象,使用ARRAY_AGG
在数组中聚合您想要的对象,然后使用array_to_json
将其转换为json数组:
WITH j(json) AS (
VALUES ('[
{
"A": "some value",
"B": "another value",
"foo": "bar",
"x": "y"
},
{
"B": "abc",
"C": "asdf"
}
]'::jsonb)
)
SELECT array_to_json(ARRAY_AGG(elem->'B'))
FROM j, jsonb_array_elements(json) elem
;
array_to_json
-------------------------
["another value","abc"]
(1 row)
WITH j(json) AS (
VALUES ('[
{
"A": "some value",
"B": "another value",
"foo": "bar",
"x": "y"
},
{
"B": "abc",
"C": "asdf"
}
]'::jsonb)
)
SELECT array_to_json(ARRAY_AGG(elem->'foo'))
FROM j, jsonb_array_elements(json) elem
;
array_to_json
---------------
["bar",null]
(1 row)