首页/数据/SQL 速查/JSON_CONTAINS 与 jsonb 包含查询
函数速查60 条

JSON_CONTAINS 与 jsonb 包含查询

判断 JSON 里是否包含某个值或结构:MySQL 用 JSON_CONTAINS/JSON_CONTAINS_PATH,PostgreSQL 用 jsonb 的 @> 与存在运算符。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
SELECT * FROM users WHERE JSON_CONTAINS(tags, '"vip"');
SELECT * FROM users WHERE JSON_CONTAINS_PATH(doc, 'all', '$.a', '$.b');
-- 多值索引(8.0.17+)可加速数组包含
CREATE INDEX idx_tags ON users ((CAST(tags AS CHAR(16) ARRAY)));
SELECT * FROM users WHERE 'vip' MEMBER OF (tags);

PostgreSQL

PostgreSQL
SELECT * FROM users WHERE tags @> '["vip"]'::jsonb;
SELECT * FROM users WHERE doc ? 'status';        -- 顶层键存在
SELECT * FROM users WHERE doc ?| ARRAY['a','b']; -- 任一键存在
SELECT * FROM users WHERE doc ?& ARRAY['a','b']; -- 全部键存在
-- 包含查询配 GIN 索引
CREATE INDEX idx_doc ON users USING gin (doc jsonb_path_ops);
MySQLJSON_CONTAINS(target, candidate[, path]);candidate 必须是合法 JSON 片段
PostgreSQL@> 包含、? / ?| / ?& 键存在;jsonb 两侧都要同类型
索引MySQL 多值索引;PG GIN(jsonb_path_ops 更省,只支持 @>)

易错点

  • MySQL 的 candidate 参数是 JSON 文本:查字符串要写 '"vip"'(带双引号),少写引号会被当成数值导致不匹配
  • @> 只支持 jsonb:json(文本)列要先转换且无法用 GIN 索引加速,建表时选 jsonb

数据来源与参考

  • MySQL 8.0 Reference Manual · JSON Functions
  • PostgreSQL Documentation · JSON Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌