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
相关产品推荐
相关产品推荐

