MySQL如何查询JSON数组字段包含任意指定多个值的记录
问题原因
你原有查询不生效的核心原因是 JSON_EXTRACT(data, '$[*]') 返回的是完整的JSON数组而非拆分后的单个元素,JSON_UNQUOTE 处理后得到的是拼接好的整串,和 IN 子句中的单个日期值完全无法匹配。
解决方案
方案1:兼容MySQL 5.7及以上版本
使用JSON_SEARCH函数实现匹配,第二个参数'one'代表只要找到任意一个匹配值就返回,刚好满足“至少包含一个目标日期”的需求:
SELECT * FROM test WHERE JSON_SEARCH(data, 'one', 'Monday') IS NOT NULL OR JSON_SEARCH(data, 'one', 'Tuesday') IS NOT NULL;
方案2:MySQL 8.0.17及以上版本(更简洁)
可以直接使用JSON_OVERLAPS函数判断两个JSON数组是否存在公共元素:
SELECT * FROM test WHERE JSON_OVERLAPS(data, '["Monday", "Tuesday"]');
补充说明
你的data字段定义为VARCHAR类型而非JSON类型,MySQL的JSON函数会自动做隐式类型转换,如果要规避潜在的格式校验问题,可以显式转换字段类型:
SELECT * FROM test WHERE JSON_OVERLAPS(CAST(data AS JSON), '["Monday", "Tuesday"]');
如果你期望返回test1和test2两条记录,只需要把Friday也加入目标匹配列表即可:
SELECT * FROM test WHERE JSON_OVERLAPS(data, '["Monday", "Tuesday", "Friday"]');
内容的提问来源于stack exchange,提问作者Omer
相关产品推荐
相关产品推荐

