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

如何在MySQL的JSON数组列中移除指定元素?

问题分析与解决方案

问题原因

你的SQL执行后group_in变为null,核心问题是:

  • group_in存储的是数字类型的JSON数组,但JSON_SEARCH默认会将传入的搜索值1当作字符串匹配数组中的数字元素,导致找不到匹配项返回null。
  • JSON_REMOVE接收null作为路径参数时,会直接返回null,最终将字段值覆盖为null。

解决方案

方案1:修正JSON_SEARCH的类型匹配

通过CAST(1 AS JSON)将搜索值转为JSON数字类型,让JSON_SEARCH能正确匹配数组元素:

UPDATE users 
SET group_in = JSON_REMOVE(group_in, JSON_UNQUOTE(JSON_SEARCH(group_in, 'one', CAST(1 AS JSON))))
WHERE id = 1;

注:若需删除数组中所有匹配的1,可将'one'改为'all',但需额外处理多路径拼接逻辑,更推荐方案2。

方案2:用JSON_TABLE重构数组(MySQL 8.0+)

该方法更灵活,适合多元素删除或复杂过滤场景:

UPDATE users u
JOIN (
    SELECT id, JSON_ARRAYAGG(value) AS new_group_in
    FROM users, JSON_TABLE(group_in, '$[*]' COLUMNS(value INT PATH '$')) jt
    WHERE id = 1 AND value != 1
    GROUP BY id
) j ON u.id = j.id
SET u.group_in = j.new_group_in
WHERE u.id = 1;

原理:将JSON数组展开为行数据,过滤掉目标元素后,重新聚合为JSON数组。

验证结果

执行任一方案后,数据将符合预期:

id | group_in
1  | [2,3]
2  | [1,3]

内容的提问来源于stack exchange,提问作者Royston Lau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:27:13