You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 10中如何基于条件提取JSON数组元素并重组字段?

解决PostgreSQL 10中JSON数组的条件拼接与重构需求

我来帮你搞定这个JSON数组的处理需求,咱们可以结合PostgreSQL的条件判断和JSON函数来实现,直接上可运行的SQL方案:

SELECT
    id,
    table1,
    did,
    execution_date,
    change_type,
    attr,
    CASE
        -- 匹配指定条件:table1为Persons且change_type为Create(兼容大小写用lower函数,不需要的话可直接去掉)
        WHEN lower(table1) = 'persons' AND lower(change_type) = 'create' THEN
            json_build_array(
                json_build_array(
                    '+',
                    'name',
                    -- 从JSON数组中提取name和firstname的值并拼接
                    (SELECT string_agg(elem->>2, ' ')
                     FROM json_array_elements(context_data::json) AS elem
                     WHERE elem->>1 IN ('name', 'firstname'))
                )
            )::text
        -- 其他场景直接返回原数据
        ELSE
            context_data
    END AS context_data
FROM your_table_name; -- 记得替换成你的实际表名

代码细节解释:

  • 条件分支处理:用CASE语句精准区分两种业务场景,lower()是为了兼容数据中可能出现的大小写差异(比如示例里的Persons和Create),如果你的数据是严格大小写匹配,直接去掉lower()即可。
  • JSON数组解析:通过json_array_elements(context_data::json)把text类型的JSON数组拆分成单独的元素行,方便筛选提取name和firstname对应的字段值。
  • 字段值拼接:用string_agg()把name和firstname对应的第三个数组元素(elem->>2,JSON数组索引从0开始计数)用空格拼接成合并字段。
  • 重构JSON结构:用json_build_array()重新构造符合要求的JSON数组结构,最后转成text类型和原字段类型保持一致。

这套语句完全适配你的示例数据:

  • 第一条满足条件的记录会被处理成[[ "+", "name", "Leon Bill" ]]
  • 第二条(Update操作)和第三条(Users表)会直接返回原始的context_data内容,完全符合你的期望输出。

内容的提问来源于stack exchange,提问作者user2210516

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:22:46