【问题标题】:Return Parts of an Array in Postgres在 Postgres 中返回数组的一部分
【发布时间】:2021-12-30 07:38:45
【问题描述】:

我的 Postgres DB (v.10) 中有一个 JSON 格式的列(文本)。 就我现在而言,它具有数组格式。

这是一个小提琴示例:Fiddle

如果 table1 = people 和 change_type = create 那么我只想返回连接为一个字段的姓名和名字并清除其余文本。

输出应该是这样的:

id  table1  did execution_date  change_type   attr      context_data
1   Persons 1   2021-01-01      Create        Name      [["+","name","Leon Bill"]]
1   Persons 2   2021-01-01      Update        Firt_name [["+","cur_nr","12345"],["+","art_cd","1"],["+","name","Leon"],["+","versand_art",null],["+","email",null],["+","firstname","Bill"],["+","code_cd",null]]
1   Users   3   2021-01-01      Create        Street    [["+","cur_nr","12345"],["+","art_cd","1"],["+","name","Leon"],["+","versand_art",null],["+","email",null],["+","firstname","Bill"],["+","code_cd",null]]

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    使用json_array_elements函数将json数组拆解成SETOF,然后将其组装回你想要的结构。

    select m.*
         , case
             when m.table1 = 'Persons' and m.change_type = 'Create'
               then (
                 select '[["+","name",' || to_json(string_agg(a.value->>2,' ' order by a.value->>1 desc))::text || ']]'
                 from json_array_elements(m.context_data::json) a
                 where a.value->>1 in ('name','firstname')
               )
             else m.context_data
           end as context_data
    from mutations m
    

    modified fiddle

    (注:

    • 使用必填字段名称的字母顺序有点脏,显式 order by case 可以提高可读性
    • 生成的 json 尽可能从字符串文字组装,因为您没有指定是否应从任何原始数组元素中获取 "+"
    • to_json()::text 仅用于安全注射

    )

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2012-04-04
      • 2017-07-20
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多