You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中查询JSON数组类型列并提取指定字段值?

如何在MySQL中查询JSON数组类型列并提取指定字段值?

嗨,我来帮你解决这个问题!你之前用LIKE匹配JSON字符串的方式确实容易踩坑——比如JSON里的字段顺序变了、多了几个空格,你的查询就直接失效了。好在MySQL从5.7版本开始提供了专门的JSON处理函数,能精准解析JSON结构,比字符串匹配靠谱太多啦。

下面给你几个实用的方法,按需选择就行:

方法1:用JSON_TABLE把JSON数组转成普通行(最灵活)

这个方法适合需要多次查询不同字段的场景,它会把JSON数组里的每个对象拆成单独的行,让你像操作普通表一样查询:

SELECT jt.value AS enabled_value
FROM SOME_TABLE,
     JSON_TABLE(
         -- 替换成你的JSON列名
         your_json_column,
         '$[*]' COLUMNS(
             name VARCHAR(255) PATH '$.name',
             value VARCHAR(255) PATH '$.value'
         )
     ) AS jt
WHERE jt.name = 'enabled';

简单解释:JSON_TABLE遍历数组里的所有元素($[*]代表数组全部元素),把每个对象的name和value提取成列,之后你就能用WHERE条件精准过滤出name为enabled的行,拿到对应的value。

方法2:用JSON_SEARCH+JSON_EXTRACT直接提取单个值

如果只是想快速提取某个特定name对应的value,可以用这两个函数组合:

SELECT 
    JSON_EXTRACT(
        your_json_column,
        -- 把找到的name路径替换成value路径
        REPLACE(JSON_SEARCH(your_json_column, 'one', 'enabled', NULL, '$[*].name'), '.name', '.value')
    ) AS enabled_value
FROM SOME_TABLE;

这里JSON_SEARCH会定位到name等于enabled的元素路径(比如返回"$[0].name"),再用REPLACE把.name改成.value,最后JSON_EXTRACT就能提取出对应的值。参数'one'表示只取第一个匹配结果,如果数组里有多个同名name,可以改成'all'。

方法3:在WHERE条件里判断指定字段的值

如果你的需求是过滤出enabled为true的行,可以用JSON_CONTAINS:

SELECT *
FROM SOME_TABLE
WHERE JSON_CONTAINS(
    your_json_column,
    '{"name": "enabled", "value": "true"}',
    '$[*]'
);

注意这里的value类型要和你JSON里存储的一致——如果是字符串类型(像你例子里的"true")就带引号;如果是布尔类型(true)就去掉引号。

这些方法都是基于JSON的结构解析的,不管JSON的格式怎么变(换行、空格、字段顺序调整),都能正确匹配,完全不用担心之前LIKE方法的误差问题~

备注:内容来源于stack exchange,提问作者Gaurav789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:50:28