【问题标题】:Postgresql get keys from array of objects in JSONB fieldPostgresql 从 JSONB 字段中的对象数组中获取键
【发布时间】:2019-09-24 18:52:29
【问题描述】:

这里是 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 对象数组中获取所有键值。任何帮助都会有所帮助。谢谢

【问题讨论】:

    标签: postgresql jsonb postgresql-json


    【解决方案1】:

    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. -&gt; 运算符给出属性名称的数组;之后jsonb_agg() 将所有提取的数组重新组合在一起。

    【讨论】:

    • 你能解释一下这是如何工作的elems.value -&gt; 'name'吗?或者 elems.vlaue 是什么意思?
    • jsonb_array_elements 创建一个名为“value”的新列。在这一行中,所有数组元素都已插入。您可以通过 elems.value 选择它们(参见小提琴)。现在可以向这些元素中的每一个询问键“name”的值。
    【解决方案2】:

    我的例子

    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}';
    

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 2015-04-13
      • 2022-07-02
      • 2018-06-23
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多