以下是针对MySQL中[1,2,3]类型JSON数组字段的查询方法总结,涵盖常见场景和语法:
一、检查数组是否包含特定值
使用JSON_CONTAINS函数
查询数组中是否包含数字2:
SELECT * FROM 表名 WHERE JSON_CONTAINS(json字段, '2', '$');
-- 等效简写:WHERE json字段->'$' LIKE '%2%'
'$'表示根路径(整个数组),'2'需为有效的JSON标量值(字符串需加引号)。
多值联合查询
检查同时包含1和3:
SELECT * FROM 表名
WHERE JSON_CONTAINS(json字段, '1', '$')
AND JSON_CONTAINS(json字段, '3', '$');
不支持直接传递多值参数。
二、搜索数组中的字符串
使用JSON_SEARCH定位元素位置(返回路径或NULL):
-- 查询包含字符串"abc"的数组
SELECT * FROM 表名
WHERE JSON_SEARCH(json字段, 'one', 'abc') IS NOT NULL;
'one':找到第一个匹配即停止;'all'返回所有匹配路径。
三、精确匹配整个数组
直接比较JSON文档(严格匹配顺序和格式):
SELECT * FROM 表名
WHERE json字段 = '[1,2,3]'; -- JSON文档需完全一致
注意空格和元素顺序差异会导致匹配失败。
四、查询数组长度
使用JSON_LENGTH函数:
SELECT JSON_LENGTH(json字段) AS 数组长度 FROM 表名;
-- 示例:筛选长度≥3的数组
SELECT * FROM 表名 WHERE JSON_LENGTH(json字段) >= 3;
适用于统计或条件过滤。
五、提取数组元素
按索引获取值(索引从0开始):
-- 提取第一个元素
SELECT JSON_EXTRACT(json字段, '$[0]') AS 首元素 FROM 表名;
-- 简写:SELECT json字段->'$[0]'
路径表达式$[n]指定索引位置。
六、复杂查询(MySQL 8.0+)
使用JSON_TABLE将数组转为临时表:
SELECT j.*
FROM 表名,
JSON_TABLE(
json字段,
'$[*]' COLUMNS (
元素值 INT PATH '$'
)
) AS j
WHERE j.元素值 = 2; -- 筛选元素值=2的行
适合对数组元素执行关联查询或聚合操作。
注意事项
索引优化:对JSON字段创建虚拟列并加索引可加速查询。
浮点数处理:JSON中的数字类型可能被转换为DOUBLE,比较时需注意精度问题。
路径表达式:键名含特殊字符时需用['key']格式(如$[0]['name'])。
以上方法适用于MySQL 5.7及以上版本,部分高级功能(如JSON_TABLE)需8.0+支持。
9296

被折叠的 条评论
为什么被折叠?



