PostgreSQL的JSONB类型支持将半结构化数据以二进制格式存储,相比普通JSON类型拥有更好的查询性能和更丰富的操作函数。JSONB_EXTRACT_PATH是专门用于从JSONB数据中提取指定路径值的函数,能够应对多层嵌套的JSONB数据提取需求,避免手动逐层解析的繁琐操作。

JSONB_EXTRACT_PATH函数基本语法
JSONB_EXTRACT_PATH函数的核心作用是根据传入的路径参数,从目标JSONB值中提取对应的数据,语法格式如下:
jsonb_extract_path(
from_json jsonb, -- 待提取数据的JSONB对象
VARIADIC path_elems text[] -- 路径元素,支持多个文本参数表示嵌套路径
)
函数返回值为jsonb类型,如果路径不存在则返回null。其中VARIADIC关键字表示路径参数可以接收不定数量的文本参数,每个参数对应JSONB中的一层键名。
基础使用场景示例
首先创建测试表并插入包含JSONB字段的测试数据:
-- 创建测试表
CREATE TABLE user_info (
id INT PRIMARY KEY,
extra_data JSONB
);
-- 插入测试数据,extra_data为多层嵌套的JSONB结构
INSERT INTO user_info VALUES (
1,
'{
"name": "张三",
"age": 28,
"address": {
"province": "广东",
"city": "深圳",
"detail": {
"street": "科技园路",
"zip_code": "518000"
}
},
"hobbies": ["篮球", "阅读", "编程"]
}'
);
提取单层键对应的值
提取extra_data中name字段的值:
SELECT
id,
jsonb_extract_path(extra_data, 'name') AS user_name
FROM user_info
WHERE id = 1;
执行结果中user_name的值为"张三",返回的是JSONB格式的字符串,若需要获取普通文本可以使用->>操作符或者类型转换。
提取多层嵌套路径的值
提取address下detail中的street字段:
SELECT
id,
jsonb_extract_path(extra_data, 'address', 'detail', 'street') AS street
FROM user_info
WHERE id = 1;
执行后street的返回值为"科技园路",多个路径参数按顺序对应JSONB的嵌套层级即可。
提取数组元素的值
JSONB中的数组也支持通过路径提取,数组索引从0开始,提取hobbies数组的第一个元素:
SELECT
id,
jsonb_extract_path(extra_data, 'hobbies', '0') AS first_hobby
FROM user_info
WHERE id = 1;
返回结果为"篮球",如果需要提取数组的全部元素,可以结合jsonb_array_elements函数使用。
与其他JSONB提取方式对比
PostgreSQL还提供了->和->>操作符用于JSONB提取,和JSONB_EXTRACT_PATH函数的差异如下:
| 提取方式 | 返回类型 | 路径支持 | 使用场景 |
|---|---|---|---|
jsonb_extract_path函数 | jsonb | 支持不定数量路径参数,适合动态路径场景 | 路径参数可变、需要函数式调用的场景 |
->操作符 | jsonb | 仅支持单个键或单个索引,多层需要链式调用 | 固定单层路径的静态提取场景 |
->>操作符 | text | 仅支持单个键或单个索引,多层需要链式调用 | 需要直接获取文本结果的固定路径场景 |
例如使用->操作符提取上面的street字段需要写成extra_data->'address'->'detail'->'street',而JSONB_EXTRACT_PATH只需要传入所有路径参数即可,在路径层级不固定时更灵活。
注意事项
- 路径参数必须与JSONB中的键名完全匹配,区分大小写,否则会返回
null。 - 如果路径对应的数据不存在,函数返回
null,使用时可以结合COALESCE函数设置默认值。 - 函数返回的是
jsonb类型,如果需要其他类型,需要进行显式类型转换,比如转换为文本可以使用jsonb_extract_path(extra_data, 'name')::text。 - 如果需要提取路径后直接判断值,可以结合
jsonb_extract_path_text函数,该函数直接返回文本类型,不需要额外转换。
实战示例:带默认值的提取
如果提取的字段可能不存在,需要设置默认值,可以结合COALESCE函数使用:
SELECT
id,
COALESCE(
jsonb_extract_path(extra_data, 'address', 'detail', 'zip_code')::text,
'未知邮编'
) AS zip_code
FROM user_info
WHERE id = 1;
如果zip_code字段存在则返回对应值,不存在则返回未知邮编。
PostgreSQLJSONBJSONB_EXTRACT_PATH数据提取修改时间:2026-06-23 16:39:24