postgres jsonb,查询对象数组

时间:2018-09-09 11:44:05

标签: postgresql

我有一个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);块感兴趣,是

形式的json对象数组

<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

这是一个琐碎的查询吗?

1 个答案:

答案 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个参数:

  • 第一个是返回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