我有一个包含来自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的数据透视表功能:
首先,您需要启用该功能:
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个参数:
使用该功能,您还需要定义您将拥有的结果。这意味着as ct(....)
是强制性的。它必须引用id列和您将返回的所有列。对于您的用例,它是返回:
select distinct(m->>'label')
FROM manifest t, LATERAL jsonb_array_elements(t.data->'metadata') m
order by 1