5

这是 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" ]

但是我无法从同一个对象数组中获取所有名称键值。我只想从 json 对象数组中获取所有键值。任何帮助都会有所帮助。谢谢

4

2 回答 2

8

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
  1. jsonb_array_elements()将每个数组元素展开为一行
  2. ->运算符给出属性名称的数组;之后jsonb_agg()将所有提取的数组重新组合在一起。
于 2019-05-07T07:01:53.103 回答
0

我的例子

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}';
于 2020-10-02T08:15:32.207 回答