MySQL JSON数组查询速查
相关概念:MySQL
如果某个字段保存的是 JSON 数组,查询时常见需求通常是“这个数组里是否包含某些值”。
用 JSON_SEARCH
SELECT *
FROM custom_app
WHERE app_tag IS NOT NULL
AND (
JSON_SEARCH(app_tag, 'all', '单人', NULL, '$[*]') IS NOT NULL
OR JSON_SEARCH(app_tag, 'all', '冒险', NULL, '$[*]') IS NOT NULL
);适合“按关键字找命中项”的场景。
用 JSON_CONTAINS
SELECT *
FROM custom_app
WHERE app_tag IS NOT NULL
AND (
JSON_CONTAINS(app_tag, '\"单人\"')
OR JSON_CONTAINS(app_tag, '\"冒险\"')
);适合明确判断某个值是否存在。
用 JSON_OVERLAPS
SELECT *
FROM custom_app
WHERE app_tag IS NOT NULL
AND JSON_OVERLAPS(app_tag, '[\"单人\", \"冒险\"]');如果只是想判断“两个数组是否有交集”,这个写法通常更直接。
用 REGEXP
SELECT *
FROM custom_app
WHERE app_tag IS NOT NULL
AND app_tag REGEXP '单人|冒险';这种方式虽然短,但它本质上是在字符串层面做匹配,不是 JSON 语义层面的查询。
取舍
如果字段已经是 JSON,优先使用 JSON 函数,不要退回到字符串正则。