【问题标题】:Extract jsonb in Postgresql - dictionary and array structure in same jsonb field在 Postgresql 中提取 jsonb - 同一 jsonb 字段中的字典和数组结构
【发布时间】:2020-11-18 06:39:40
【问题描述】:

我正在使用 postgresql,我在数据集上有这个表,有些列是 jsonb。

SELECT 
external_id as cod,
title as name,
objectives
FROM table

所以,“目标”列的结果是这样的:

{"blocks":
    [
        {"key":"dek2k",
        "text":"Objetivo Geral",
        "type":"unstyled",
        "depth":0,
        "inlineStyleRanges":
            [
            {"offset":0,"length":14,"style":"fontsize-12pt"},
            {"offset":0,"length":14,"style":"fontfamily-Arial"},
            {"offset":0,"length":14,"style":"fontsize-14"}
            ],
        "entityRanges":[],
        "data":{"text-align":"start"}},
        {"key":"ct1vn",
        "text":"Conhecer e aplicar ferramentas para análise da mídias em sua respectiva relação com a cognição e o design,",
        "type":"unstyled","depth":0,"inlineStyleRanges":
            [
            {"offset":0,"length":216,"style":"color-rgb(0,0,0)"},
            {"offset":0,"length":216,"style":"fontsize-12pt"},
            {"offset":0,"length":216,"style":"fontfamily-Arial"},
            {"offset":0,"length":216,"style":"fontsize-14"}
            ],
        "entityRanges":[],
        "data":{}},
        {"key":"8jshq",
        "text":"","type":"unstyled","depth":0,
        "inlineStyleRanges":[],
        "entityRanges":[],"data":{}},
        {"key":"avq4h",
        "text":"tendo como ênfase os estudos das materialidades dos meios de comunicaçõe e seus aspectos sensoriais.",
        "type":"unstyled",
        "depth":0,
        "inlineStyleRanges":
            [
            {"offset":0,"length":23,"style":"color-rgb(0,0,0)"},
            {"offset":0,"length":23,"style":"fontsize-12pt"},
            {"offset":0,"length":23,"style":"fontfamily-Arial"},
            {"offset":0,"length":23,"style":"fontsize-14"}
            ],
        "entityRanges":[],
        "data":{}}
    ],
"entityMap":{}
}

我只想得到“文本”中的结果。有时它只有一个“文本”值,有时它有多达 15 个或更多。

我需要的是表中所有行的这样的结果:

 cod      |      name      | objectives
----------+-----------------+----------
 1        | A              | Objetivo Geral Conhecer e aplicar ferramentas para análise da mídias em sua respectiva relação com a cognição e o design, tendo como ênfase os estudos das materialidades dos meios de comunicaçõe e seus aspectos sensoriais.

有什么线索吗?

【问题讨论】:

    标签: arrays postgresql dictionary jsonb


    【解决方案1】:

    带有string_agg()的json函数实现你想要的。

    使用WITH ORDINALITY 保证text 元素的正确排序。

    SELECT t.external_id as cod,
           t.title as name,
           string_agg(a.block->>'text', ' ' ORDER BY rn) as objectives
      FROM "table" t
           CROSS JOIN LATERAL jsonb_array_elements(t.objectives->'blocks')
                               WITH ORDINALITY as a(block, rn)
     GROUP BY t.external_id, t.title;
    

    【讨论】:

    • 我收到此错误:错误:运算符不存在:文本 -> 未知第 5 行:...OSS JOIN LATERAL jsonb_array_elements(t.objectives->'blocks'... ^ 提示:否运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
    • 您能否在原始问题中显示您的表格定义? objectives 列的数据类型是什么?
    • 哦,抱歉,objectives 是一个带有 jsonb 格式的文本列 ``` tcreate_table "table", force: :cascade do |t| t.string "title", null: false t.text "objectives" t.bigint "institution_id", null: false t.integer "code" t.jsonb "external_data", 默认: {} t.string "external_id" t .jsonb "extra_fields",默认值:[] t.bigint "template_id" ```
    • @FabíolaMagossi 这是否意味着您应该使用t."external data" 而不是t.objectives?我在这里有一个可用的 DB-Fiddle:db-fiddle.com/f/tJUTm5HXF4jpEVR5qbegZK/0 如果仍有问题,请发表评论。
    • 不,外部数据还有其他信息,我也无法处理...我在这里粘贴的信息来自目标。它是一个文本字段,但它看起来像一个 jsonb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2021-02-12
    • 2018-03-25
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多