JSON_EXTRACT是MySQL 5.7+原生函数,用于安全提取JSON字段值;必须用标准路径语法(如$.name、$[0].price),路径错误返回NULL不报错,需确保JSON合法、路径准确、大小写匹配。

MySQL 5.7+ 怎么用 JSON_EXTRACT 查 JSON 字段里的值
直接说结论:JSON_EXTRACT 是 MySQL 原生支持的函数,能安全读取 JSON 字段中的嵌套值,但必须用标准 JSON 路径语法(如 $."name" 或 $.items[0].price),路径写错就返回 NULL,不会报错——这点特别容易误判结果。
常见错误现象:查出来全是 NULL,但字段明明有数据;或者只查到第一层,深层字段取不到。
- 路径开头必须是
$,后面用点号(.)访问对象键,用方括号([n])访问数组元素 - 键名含空格或特殊字符,必须用双引号包裹,比如
$."user id",写成$.user id会语法错误 - 如果不确定路径是否存在,建议配合
COALESCE(JSON_EXTRACT(...), 'default')避免空值干扰逻辑 -
JSON_EXTRACT返回的是带引号的 JSON 字符串(比如"admin"),如需纯字符串,得再套一层JSON_UNQUOTE()
PostgreSQL 怎么等效替代 JSON_EXTRACT
PostgreSQL 没有叫 JSON_EXTRACT 的函数,但行为最接近的是 -> 和 ->> 操作符,区别很关键:
-
col->'name'返回 JSON 类型(带引号,仍是 JSON 结构) -
col->>'name'返回 TEXT 类型(自动去掉引号,直接是字符串值) - 多层嵌套用链式写法,比如
col->'data'->>'status',不能写成col->'data.status' - 访问数组第 0 个元素用
col->'items'->0,注意 PostgreSQL 数组下标从 0 开始,且不支持负数索引 - 如果路径不存在,
->和->>都返回NULL,和 MySQL 行为一致
为什么 JSON_EXTRACT(json_col, '$.tags[0]') 有时返回 NULL?
不是数据丢了,大概率是 JSON 格式或路径不匹配。MySQL 对 JSON 字段存入时会校验格式,但查询时不会帮你“容错”。
- 确认字段类型确实是
JSON,不是TEXT或VARCHAR——后者调用JSON_EXTRACT会静默失败(返回NULL) - 检查原始 JSON 是否合法:用
JSON_VALID(json_col)查一下,返回 0 就说明存进去的就是非法字符串 - 数组索引越界:比如
$.tags[0]但tags是空数组[]或根本不存在,结果就是NULL - 大小写敏感:
$.Name和$.name是不同键,JSON 路径严格区分大小写 - 用
JSON_KEYS(json_col)看顶层有哪些 key,快速验证结构是否符合预期
提取多个字段时,别反复调用 JSON_EXTRACT
一次查多个值,性能差还啰嗦。MySQL 可用 JSON_EXTRACT 传多个路径,PostgreSQL 推荐用 jsonb_to_record 或 json_to_record 一次性展开。
- MySQL 示例:
SELECT JSON_EXTRACT(data, '$.name', '$.age', '$.active') FROM users;—— 返回一个 JSON 数组,如["Alice", 28, true] - 更实用的是配合列别名:
SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.name')) AS name, ... - PostgreSQL 更推荐:
SELECT (j).* FROM users, LATERAL json_to_record(data) AS j(name text, age int, active boolean); - 注意:MySQL 多路径提取不支持别名,必须自己拆;PostgreSQL 展开后字段名要和 JSON key 严格一致,否则为
NULL
深层嵌套、动态 key 名、或需要条件过滤 JSON 内容时,这些基础提取就不太够了——那得上 JSON_CONTAINS、JSON_SEARCH 或 PostgreSQL 的 @> 操作符,不过那是另一个问题了。











