代码之家  ›  专栏  ›  技术社区  ›  xabush

更新PostgreSQL中JSON列中的字段

  •  2
  • xabush  · 技术社区  · 7 年前

    我有一个 工作项 具有以下架构的表

    +---------+----------+---------------+
    |  id     |   data   |   data_type   |
    +------------------------------------+
    |         |          |               |
    |         |          |               |
    |         |          |               |
    +---------+--------------------------+
    

    以及 文件类型 具有以下架构的表:

    +---------+----------+
    |  id     | name     |
    +--------------------+
    |         |          |
    |         |          |
    |         |          |
    +---------+-----------
    

    数据列是 json格式 具有 类型 字段。这是一个列数据示例:

    {"Id":"5d35a41f-3e91-4eda-819d-0f2d7c2ba55e","WorkItem":"24efa9ea-4291-4b0a-9623-e6122201fe4a","Type":"Tax Document","Date":"4/16/2009"}
    

    我需要更新数据列 data_type 列值为 文档模型 类型 字段值与 文件类型 包含文档类型id和文档类型名称的json对象的表。像这样的东西 {"id": "<doc_type_id>", name: "<doc_type_name>"} .

    我试图通过执行以下查询来执行此操作:

    update wf.work_item wi
    set data = jsonb_set(data::jsonb, '{Type}',(SELECT jsonb_build_object('id', dt.id, 'name', dt.name) FROM wf.document_type as dt WHERE wi.data ->> 'Type'::text = dt.name::text), false)
    where wi.data_type = 'DocumentModel'; 
    

    上面的脚本运行时没有错误。然而,它所做的是不需要的,它改变了 数据 数据类型 列到 无效的 而不是更新 数据 列。

    我的剧本有什么问题?或者你能建议一个更好的选择来做一个想要的更新吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   klin    7 年前

    document_type 桌子。那么 jsonb_set() 回报 null (因为子查询没有给出任何结果)。更安全的解决方案是使用 from 从句 update :

    update wf.work_item wi
    set data = jsonb_set(
        data::jsonb, 
        '{Type}',
        jsonb_build_object('id', dt.id, 'name', dt.name),
        false)
    from wf.document_type as dt 
    where wi.data_type = 'DocumentModel'
    and wi.data ->> 'Type'::text = dt.name::text;