我有一个jsonb字段,其中包含来自iiif清单的json。
我对提取// This event handler prevents typing in the input, because we haven't broken preventDefault
document.getElementById("the-input").addEventListener("keydown", function(e) {
e.preventDefault();
}, false);
块感兴趣,是
<input id="the-input" type="text">
示例:
metadata
我希望查询中包含{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
这是一个琐碎的查询吗?
答案 0 :(得分: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个参数:
使用该函数,您还需要定义要获得的结果。这意味着as ct(....)
是强制性的。
它必须引用id列以及您将要返回的所有列。对于您的用例,它的返回值是:
select distinct(m->>'label')
FROM manifest t, LATERAL jsonb_array_elements(t.data->'metadata') m
order by 1