PostgreSQL如何从JSONB类型中仅查询指定子键,支持PG14新特性
实现方案
以下优先使用PostgreSQL 14新增的JSON操作特性实现需求,兼顾可读性和性能:
方案1:PG14专属最优写法(推荐)
使用PG14新增的jsonb_map函数遍历JSON对象的所有键值对,结合JSONB减法操作符直接删除子对象的info字段:
SELECT jsonb_map(slots, (key, val) => val - 'info') AS slots FROM test;
说明:
jsonb_map是PG14新增的JSON变换函数,可直接对JSON对象的每一组键值做自定义处理val - 'info'是JSONB的减法操作符,用于删除指定键,这里直接移除每个子对象的冗余info字段,最终返回结构完全符合预期。
方案2:固定外层键场景简化写法
如果外层的0、1这类键是固定的,可以直接用路径删除操作符实现:
SELECT slots #- '{0,info}' #- '{1,info}' AS slots FROM test;
兼容低版本PG的通用写法
如果需要兼容PostgreSQL 13及更早版本,可以用拆包再聚合的方式实现:
SELECT jsonb_object_agg(key, val - 'info') AS slots FROM test, jsonb_each(slots) GROUP BY test.ctid;
所有方案的返回结果均为:
{"0": {"tag": "abc"}, "1": {"tag": "def"}}
内容的提问来源于stack exchange,提问作者drmrbrewer
相关产品推荐
相关产品推荐

