应优先使用jsonb_path_query提取多层嵌套字段,因其路径表达清晰、容错性强且支持条件过滤和数组展开;链式->易因null或类型错误静默返回null,不支持通配符与条件过滤。

直接用 jsonb_path_query,别硬链 -> 多层;它路径清晰、容错强,且支持条件过滤和数组展开。
用 jsonb_path_query 提取多层嵌套字段
当 JSONB 数据嵌套超过两层(比如 {"data": {"user": {"id": 123}}}),硬写 col->'data'->'user'->>'id' 极易因某级为 null 或类型不符而静默返回 null,查不到数据还难定位问题。
- 路径必须以
$开头,字符串字面量用单引号:正确写法是$.data.user.id,不是$.data."user".id - 数组要展开必须加
[*]:比如$.data.tags[*]返回每项一行,$.data.tags只返回整个数组对象 - 返回值是
jsonb类型,WHERE 中做文本匹配要先转:写成(jsonb_path_query(col, '$.data.user.name')::text) = 'Alice',否则类型不匹配查不到 - 该函数不走 GIN 索引,高频查询别直接放 WHERE;建议提前物化关键字段到普通列
用 -> 和 ->> 取数组元素时索引从 0 开始
对 JSONB 数组取第 N 个元素,别绕路调 jsonb_extract_path;-> 和 ->> 更直白高效。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
col->'tags'->0返回第一个元素(jsonb类型),还能继续链式解析,比如col->'tags'->0->>'name' -
col->'tags'->>0返回第一个元素的文本值(text类型),适合拼接或LIKE匹配 - 负数索引取末尾:
col->'tags'->>-1是最后一个元素 - 空数组、路径不存在、索引越界都返回 SQL
null;但->>对null字段会返回字符串'null',WHERE 中容易误判,务必用IS NULL判断 - 别写
col->'tags'[0]或col->'tags'.0—— 语法错误
用 jsonb_to_recordset 摊平同构数组并 JOIN
面对 {"orders": [{"id": 1, "amt": 100}, {"id": 2, "amt": 200}]} 这类结构,想转成关系行再关联其他表,jsonb_to_recordset 比手动组合 jsonb_array_elements + jsonb_populate_record 更简洁。
- 类型声明必须严格匹配:写
id int, amt numeric,不能写id integer或amt decimal,错一个字段整行静默丢弃 - 数组为空或为
null时函数返回空结果集,主表记录会被 JOIN 丢掉;必要时改用LEFT JOIN LATERAL ... ON true - 别在子查询里反复解析同一 JSONB 字段,先用 CTE 或内联视图提取一次再复用
最易被忽略的是类型转换和索引失效:所有 jsonb_path_query 和 jsonb_path_exists 的结果默认是 jsonb,直接用于比较或过滤前必须显式转 ::text 或 ->>;另外这些路径函数完全不走 GIN 索引,线上高频场景务必提前冗余字段。










