如何在MySQL中查询JSON类型列并排除指定属性?
嘿,针对你这个MySQL JSON列的查询需求,我整理了两种实用的方法,看哪种更符合你的场景:
方法1:保留JSON格式,移除指定键(MySQL 5.7及以上适用)
如果你的需求是得到一个不包含startdate和enddate的JSON对象,直接用JSON_REMOVE函数就可以,非常简洁:
SELECT JSON_REMOVE(months, '$.startdate', '$.enddate') AS filtered_month_data FROM your_table_name;
拿你的示例数据来说,执行这条查询后会返回:
{"2018Apr": "2500", "2018Jun": "9000", "2018May": "4000"}
方法2:展开为键值对的行(MySQL 8.0及以上适用)
如果需要把每个动态键值对单独作为一行返回(方便后续统计或处理),就用JSON_TABLE来解析JSON对象的键和值,再过滤掉不需要的键:
SELECT jt.key_name, jt.key_value FROM your_table_name, -- 先提取JSON列中的所有键 JSON_TABLE( JSON_KEYS(months), '$[*]' COLUMNS( key_name VARCHAR(100) PATH '$' ) ) AS keys_list -- 根据提取到的键,对应获取每个键的值 JOIN JSON_TABLE( months, '$' COLUMNS( key_value VARCHAR(100) PATH CONCAT('$.', keys_list.key_name) ) ) AS jt WHERE keys_list.key_name NOT IN ('startdate', 'enddate');
执行后会得到这样的结构化结果:
| key_name | key_value |
|---|---|
| 2018Apr | 2500 |
| 2018Jun | 9000 |
| 2018May | 4000 |
小提示
- 记得把SQL里的
your_table_name替换成你实际使用的表名 - 如果你的动态键长度超过100,可以调整
VARCHAR的定义值 - 方法2依赖
JSON_TABLE特性,只有MySQL 8.0及以上版本支持哦
内容的提问来源于stack exchange,提问作者Harsh Saudagar
相关产品推荐
相关产品推荐

