如何在MySQL WHERE子句中遍历数组格式字段进行查询?
MySQL查询:筛选存储为数组格式字符串的列中包含指定值的记录
问题描述
现有MySQL表结构及数据如下:
| Name | Total | GivenBy |
|---|---|---|
| Z | 200 | ['A','B','C'] |
| X | 240 | ['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
相关产品推荐
相关产品推荐

