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

如何在MySQL WHERE子句中遍历数组格式字段进行查询?

MySQL查询:筛选存储为数组格式字符串的列中包含指定值的记录

问题描述

现有MySQL表结构及数据如下:

NameTotalGivenBy
Z200['A','B','C']
X240['A','D','C']

需要筛选出GivenBy列中包含'B'的记录,期望逻辑类似:

SELECT * FROM mytable WHERE GivenBy='B';

要求:单条查询语句完成,不能新增列,需兼容MySQL。

解决方案

根据GivenBy列的存储格式(标准JSON数组/自定义伪数组字符串),提供两种兼容方案:

1. 若GivenBy为标准JSON数组(存储为["A","B","C"],双引号格式)

利用MySQL 5.7+支持的JSON函数JSON_CONTAINS直接匹配:

SELECT * FROM mytable WHERE JSON_CONTAINS(GivenBy, '"B"');

注:JSON_CONTAINS的第二个参数必须是JSON格式字符串,因此需将目标值用双引号包裹。

2. 若GivenBy为自定义伪数组字符串(如示例中的['A','B','C']单引号格式)

通过字符串替换将伪数组转为逗号分隔的纯字符串,再用FIND_IN_SET匹配:

SELECT * FROM mytable 
WHERE FIND_IN_SET('B', REPLACE(REPLACE(REPLACE(GivenBy, '[', ''), ']', ''), '''', '')) > 0;

逻辑说明:

  • REPLACE(GivenBy, '[', ''):移除左括号
  • REPLACE(..., ']', ''):移除右括号
  • REPLACE(..., '''', ''):移除所有单引号
  • 最终将['A','B','C']转为A,B,C,FIND_IN_SET会返回目标值在逗号分隔字符串中的位置,大于0即表示存在。

备选正则匹配方案(避免误匹配)

如果担心FIND_IN_SET的替换逻辑可能出现特殊字符干扰,可使用正则表达式精准匹配:

SELECT * FROM mytable 
WHERE GivenBy REGEXP '(^|,) ''B''(,|$)' 
OR GivenBy REGEXP '^''B''$';

注:正则会匹配'B'作为数组的第一个元素、中间元素、最后元素或唯一元素的情况,避免误匹配类似'AB'的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:30:58