0Pricing
SQL Academy · 课时

路径操作符:-> ->> @>

使用 ->、->> 和 #>> 导航 JSONB 文档,并使用 @> 以及 jsonb_path_query 系列检查包含关系

路径操作符:-> ->> @> 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

三类运算符

JSONB 路径运算符分为三类:

  • -> 和 ->>——按键或索引提取
  • #> 和 #>>——按路径提取
  • @> 和 ?——测试包含关系或键是否存在

-> 返回 JSONB

提取一个值,并将其保留为 JSONB:

SELECT data->'user_id' FROM events;
-- returns JSONB like  42

SELECT data->0 FROM events;
-- first element of a JSONB array

->> 返回文本

将一个值提取为 TEXT——便于进行类型转换:

SELECT data->>'user_id'  FROM events;
-- '42'  (TEXT)

SELECT (data->>'user_id')::BIGINT FROM events;
-- 42    (BIGINT)

#> 路径提取(JSONB)

通过键数组遍历多个层级:

SELECT data #> '{user, address, city}' FROM events;
-- nested JSONB value

#>> 路径提取(TEXT)

与 #> 相同,但返回 TEXT:

SELECT data #>> '{user, address, city}' FROM events;
-- 'Berlin'

@> 包含关系

“文档是否包含这个子文档?”——最有用的筛选方式:

SELECT * FROM events
WHERE data @> '{"type":"login"}';

-- Works for nested matching too:
WHERE data @> '{"user":{"plan":"pro"}}'

? 键存在性

测试顶层是否存在某个键:

SELECT * FROM events WHERE data ? 'error';
SELECT * FROM events WHERE data ?| ARRAY['a','b'];    -- any of these keys
SELECT * FROM events WHERE data ?& ARRAY['a','b'];    -- all of these keys

JSONB 路径查询(jsonb_path_query)

现代 PostgreSQL 支持 SQL/JSON 路径表达式:

SELECT jsonb_path_query(data, '$.user.tags[*]') FROM events;
SELECT jsonb_path_exists(data, '$.user.tags[*] ? (@ == "admin")') FROM events;

与索引结合使用

GIN 索引可以加快 @> 和 ? 的查询:

CREATE INDEX events_data_gin ON events USING GIN (data);
-- supports @>, ?, ?|, ?&

CREATE INDEX events_data_path_gin ON events USING GIN (data jsonb_path_ops);
-- smaller, faster — but only supports @>

查询 JSONB 内的数组

查找数组包含某个值的文档:

SELECT * FROM events
WHERE data->'tags' @> '["admin"]'::JSONB;

-- Or via path query:
SELECT * FROM events
WHERE jsonb_path_exists(data, '$.tags[*] ? (@ == "admin")');

更新 JSONB

使用 jsonb_set、|| 和 - 进行修改:

UPDATE events
SET data = jsonb_set(data, '{user,plan}', '"pro"')
WHERE id = 1;

UPDATE events SET data = data || '{"new_field":true}'::JSONB;
UPDATE events SET data = data - 'old_field';

聚合 JSONB

将多行组合成一个 JSONB:

SELECT jsonb_agg(data) FROM events WHERE user_id = 42;
SELECT jsonb_object_agg(name, value) FROM settings;

总结

路径运算符可以完成从提取到修改的所有操作。

  • -> 返回 JSONB,->> 返回 TEXT
  • #> 返回路径,#>> 返回路径 TEXT
  • @> 表示包含关系(支持 GIN 索引)
  • 使用 jsonb_set / || / - 进行更新

快速检查

data->'k' 和 data->>'k' 有什么区别?

常见问题解答

「路径操作符:-> ->> @>」课时是免费的吗?

是的 — 「路径操作符:-> ->> @>」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「路径操作符:-> ->> @>」这节课中我会学到什么?

使用 ->、->> 和 #>> 导航 JSONB 文档,并使用 @> 以及 jsonb_path_query 系列检查包含关系 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「路径操作符:-> ->> @>」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. JSONB 与 JSON:如何选择
  2. 路径操作符:-> ->> @>
  3. 使用 GIN 为 JSONB 建立索引
  4. 建模:何时 JSONB 优于规范化
← 返回 SQL Academy