Postgresql 从 JSONB 字段中的对象数组中获取键
Postgresql get keys from array of objects in JSONB field
这里是 jsonb 列的虚拟数据
[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]
我想从 jsonb 个对象数组中获取所有名称键值...期待输出 -
[ [ "sun11", "sun12" ], [ "sun12", "sun13" ], [ "sun14", "sun15" ] ]
问题是我可以通过给出 0、1 等索引来获取名称键值
SELECT data->0->'name' FROM public."user";
[ "sun11", "sun12" ]
但我无法从 object.I 的同一个数组中获取所有名称键值 只想从 json 对象数组中获取所有键值。任何帮助都会有所帮助。谢谢
demo:db<>fiddle(首先进行最终查询,下面是中间步骤)
WITH data AS (
SELECT '[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]'::jsonb AS jsondata
)
SELECT
jsonb_agg(elems.value -> 'name') -- 2
FROM
data,
jsonb_array_elements(jsondata) AS elems -- 1
- j
sonb_array_elements()
将每个数组元素扩展为一行
->
运算符给出属性名数组;之后 jsonb_agg()
将所有提取的数组再次放入一个数组中。
我的例子
SELECT DISTINCT sub.name FROM (
SELECT
jsonb_build_object('name', p.data->'name') AS name
FROM user AS u
WHERE u.data IS NOT NULL
) sub
WHERE sub.name != '{"name": null}';
这里是 jsonb 列的虚拟数据
[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]
我想从 jsonb 个对象数组中获取所有名称键值...期待输出 -
[ [ "sun11", "sun12" ], [ "sun12", "sun13" ], [ "sun14", "sun15" ] ]
问题是我可以通过给出 0、1 等索引来获取名称键值
SELECT data->0->'name' FROM public."user";
[ "sun11", "sun12" ]
但我无法从 object.I 的同一个数组中获取所有名称键值 只想从 json 对象数组中获取所有键值。任何帮助都会有所帮助。谢谢
demo:db<>fiddle(首先进行最终查询,下面是中间步骤)
WITH data AS (
SELECT '[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]'::jsonb AS jsondata
)
SELECT
jsonb_agg(elems.value -> 'name') -- 2
FROM
data,
jsonb_array_elements(jsondata) AS elems -- 1
- j
sonb_array_elements()
将每个数组元素扩展为一行 ->
运算符给出属性名数组;之后jsonb_agg()
将所有提取的数组再次放入一个数组中。
我的例子
SELECT DISTINCT sub.name FROM (
SELECT
jsonb_build_object('name', p.data->'name') AS name
FROM user AS u
WHERE u.data IS NOT NULL
) sub
WHERE sub.name != '{"name": null}';