MySQL JSON数组查询速查

相关概念:MySQL

如果某个字段保存的是 JSON 数组,查询时常见需求通常是“这个数组里是否包含某些值”。

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 函数,不要退回到字符串正则。