MySQL中如何查询JSON字段包含指定单个或多个数字的行?
问题解答
1. 原有SQL错误修复
你编写的SQL参数使用错误,MySQL JSON_CONTAINS 函数的正确传参顺序为:JSON_CONTAINS(待查询的JSON字段, 要匹配的JSON值, [查询路径])
你的代码错误将表名test作为第一个参数传入,同时路径参数配置错误。如果participants字段本身是JSON类型的数值数组,正确的单值查询(筛选出participants包含数字2的行)写法如下:
SELECT * FROM `test` WHERE JSON_CONTAINS(`participants`, '2', '$');
如果participants是VARCHAR类型存储的JSON字符串,需要先解析为JSON类型再查询:
SELECT * FROM `test` WHERE JSON_CONTAINS(JSON_PARSE(`participants`), '2', '$');
2. 多数字查询实现
分为两种常见场景实现:
- 场景1:只要包含任意一个指定数字即可命中(包含1/2/3/4/5中任意一个即符合条件)
MySQL 8.0.17及以上版本可以直接使用JSON_OVERLAPS函数判断两个数组是否存在交集:
低版本MySQL可以用多个SELECT * FROM `test` WHERE JSON_OVERLAPS(`participants`, '[1,2,3,4,5]');JSON_CONTAINS加OR拼接实现:SELECT * FROM `test` WHERE JSON_CONTAINS(`participants`, '1', '$') OR JSON_CONTAINS(`participants`, '2', '$') OR JSON_CONTAINS(`participants`, '3', '$') OR JSON_CONTAINS(`participants`, '4', '$') OR JSON_CONTAINS(`participants`, '5', '$'); - 场景2:必须同时包含所有指定数字才命中(同时包含1、2、3、4、5才符合条件)
直接把目标数组作为JSON_CONTAINS的第二个参数传入即可,函数会校验目标数组的所有元素是否都存在于participants数组中:SELECT * FROM `test` WHERE JSON_CONTAINS(`participants`, '[1,2,3,4,5]', '$');
内容的提问来源于stack exchange,提问作者teteyi3241
相关产品推荐
相关产品推荐

