postgres jsonb,查询对象数组

乔治·利瓦诺斯

我有一个jsonb字段,其中包含来自iiif清单的json
我对提取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"
    }
]

我想要一个查询,以的所有对象的名称作为labelrelative的,例如:valuemetadata[]

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

这是一个琐碎的查询吗?

沃格雷

它可能是微不足道的(或没有)。

如果您知道元数据中的每个标签(也许是因为您早先提取了它们),则可以使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章