测试表准备(Hologres/PG 通用)
CREATE TABLE tmp_jsonb_demo (
id INT,
info jsonb
);
INSERT INTO tmp_jsonb_demo VALUES
(1, '{"name":"订单A","amount":100.0,"tags":["对账","异常"],"meta":{"create_time":"2026-10-19"}}'::jsonb),
(2, '["苹果","香蕉",100]'::jsonb),
(3, '{}'::jsonb),
(4, NULL);
| 分类 | 函数 / 操作符 | 功能说明 | 示例 SQL | 执行结果 | ||
|---|---|---|---|---|---|---|
| 取值操作符 | -> |
获取 json 子节点,返回jsonb 类型 | SELECT info -> 'name' FROM tmp_jsonb_demo WHERE id=1; |
"订单A"(jsonb) |
||
->> |
获取 json 子节点,返回text 文本(最常用,可直接 cast) | SELECT info ->> 'amount' FROM tmp_jsonb_demo WHERE id=1; |
100.0(字符串) |
|||
#> |
多层路径取值,返回 jsonb | SELECT info #> '{meta,create_time}' FROM tmp_jsonb_demo WHERE id=1; |
"2026-10-19" |
|||
#>> |
多层路径取值,返回 text(推荐多层使用) | SELECT info #>> '{meta,create_time}' FROM tmp_jsonb_demo WHERE id=1; |
2026-10-19 |
|||
| Key 存在判断 | col ? 'key' |
判断顶层是否存在指定 key,等价jsonb_exists |
SELECT info ? 'name' FROM tmp_jsonb_demo WHERE id=1; |
true |
||
jsonb_exists(jsonb, text) |
判断顶层 key 是否存在,兼容写法 | SELECT jsonb_exists(COALESCE(info, '{}'::jsonb), 'name') FROM tmp_jsonb_demo WHERE id=1; |
true |
|||
| `? | ` | 是否存在任意一个 key(多 key 或条件) | `SELECT info ? | array'name','xxx' FROM tmp_jsonb_demo WHERE id=1;` | true |
|
?& |
必须同时存在全部 key(多 key 且条件) | SELECT info ?& array['name','amount'] FROM tmp_jsonb_demo WHERE id=1; |
true |
|||
| 包含匹配 | @> |
左边 json 是否包含右边 json | SELECT info @> '{"name":"订单A"}'::jsonb FROM tmp_jsonb_demo WHERE id=1; |
true |
||
<@ |
左边 json 被包含在右边 json 内 | SELECT '{"name":"订单A"}'::jsonb <@ info FROM tmp_jsonb_demo WHERE id=1; |
true |
|||
| JSON 对象修改 | jsonb_set(target, path, new_val, [create_missing]) |
修改 / 新增指定路径的值 | ```sql |