postgres jsonb,查询一个对象数组

问题描述 投票:1回答:1

我有一个包含来自iiif清单的json的jsonb字段。 我有兴趣提取metadata块,是一个形式的json对象数组

{label:"', value:""}

例:

"metadata": [
    {
        "label": "Homepage",
        "value": "<span><a href=\"https://digital.bodleian.ox.ac.uk/inquire/p/1bac4a1e-fba6-4466-baf5-ef2d45a47ec1\">View on Digital Bodleian</a></span>"
    },
    {
        "label": "Creator",
        "value": "Exeter-'Change (London, England) [author]"
    },
    {
        "label": "Contributors",
        "value": "Incledon, Charles Benjamin, 1763-1826 [performer]"
    },
    {
        "label": "Date Statement",
        "value": "1781-11-24"
    }
]

对于label的所有对象,我想查询一个名为value的列与metadata[]相关,例如:

|Creator                                    |Contributors                                     |
|-------------------------------------------|-------------------------------------------------|
|Exeter-'Change (London, England) [author]  |Incledon, Charles Benjamin, 1763-1826 [performer]|

这是一个简单的查询撰写?

postgresql
1个回答
0
投票

它可能是微不足道的[或不是]。

如果您知道元数据中的每个标签(可能是因为您之前提取过它们),那么您可以使用postgresql的数据透视表功能:

首先,您需要启用该功能:

CREATE extension tablefunc;

然后你可以像这样使用交叉表:

SELECT * FROM crosstab ('
    SELECT t.id as id, m->>''label'', m->>''value'' 
        FROM import.manifest t, 
             LATERAL jsonb_array_elements(t.data->''metadata'') m 
        ORDER BY 1,2
    ', '
        select distinct m->>''label'' 
            FROM import.manifest t, 
                 LATERAL jsonb_array_elements(t.data->''metadata'') m 
            order by 1
    ') AS ct (id int,Author text, Contributors text, Creator text, "Date Statement" text, Homepage text, Published text);

您必须将所有标签放在查询中,这就是为什么它不是那么简单。

交叉表函数有2个参数:

  • 第一个是返回3列的SQL: 一个用于连接数据的ID列 关键栏目。此列中的文本将是结果中列的名称 价值栏
  • 第二个,是一个返回所有列的SQL。

使用该功能,您还需要定义您将拥有的结果。这意味着as ct(....)是强制性的。它必须引用id列和您将返回的所有列。对于您的用例,它是返回:

select distinct(m->>'label') 
    FROM manifest t, LATERAL jsonb_array_elements(t.data->'metadata') m 
    order by 1
© www.soinside.com 2019 - 2024. All rights reserved.