PostgreSQL 14.9:如何拆分JSONB数组并筛选指定code值输出?
PostgreSQL拆分JSONB数组并保留匹配元素的正确SQL写法
你的问题出在使用了a.*,这会直接带出原表中完整的Detail数组字段。要实现每个符合code='156'的JSONB元素单独成行,且Detail列仅保留该元素,需要调整查询的字段选择逻辑,同时利用JSONB专属的数组处理函数提升性能:
正确SQL语句
SELECT a.Name, j AS Detail FROM public.a_table a CROSS JOIN LATERAL jsonb_array_elements(a.Detail) AS j WHERE j->>'code' = '156' ORDER BY a.Name DESC;
关键说明
- 不再使用
a.*,而是显式指定a.Name,并将匹配的数组元素j重命名为Detail,这样输出的Detail列就只会是单个符合条件的JSONB元素 - 由于你的
Detail字段类型是JSONB,直接使用jsonb_array_elements处理,无需转换成JSON类型,避免不必要的类型转换开销 CROSS JOIN LATERAL会将每条数据的JSONB数组拆分成单独行,再通过WHERE条件过滤出code='156'的元素
预期输出示例
| Name | Detail |
|---|---|
| lemon | {"code": "156", "color": "green"} |
| lemon | {"code": "156", "color": "blue"} |
| lemon | {"code": "156", "color": "black"} |
| apple | {"code": "156", "color": "red"} |
| apple | {"code": "156", "color": "blue"} |
| orange | {"code": "156", "color": "yellow"} |
内容的提问来源于stack exchange,提问作者Makoto Makoto
相关产品推荐
相关产品推荐

