You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对JSON列中的数组元素执行不区分大小写的搜索?

解决JSON数组标签的不区分大小写完整匹配问题

方法一:用JSON_TABLE拆分数组后匹配(无需改表)

把JSON数组拆成单行的字符串,再做不区分大小写的等值比较,既能保证完整匹配,又不用修改原表结构:

SELECT e.*
FROM events e
JOIN JSON_TABLE(
    e.meta->"$.tags",
    "$[*]" COLUMNS(tag VARCHAR(255) PATH "$")
) AS tag_rows
WHERE tag_rows.tag COLLATE utf8mb4_general_ci = "Key1:VaLuE1" COLLATE utf8mb4_general_ci;

原理是通过JSON_TABLE将数组中的每个标签单独提取出来,转换成普通字符串列后,指定不区分大小写的排序规则做等值匹配,完全避免了LIKE的部分匹配问题。

方法二:用LOWER()结合JSON_SEARCH(简洁写法,无需改表)

如果你的MySQL版本支持LOWER()处理JSON数组(MySQL 8.0及以上),可以直接把数组和目标值都转成小写后搜索:

SELECT *
FROM events
WHERE JSON_SEARCH(LOWER(meta->"$.tags"), 'one', LOWER("Key1:VaLuE1")) IS NOT NULL;

LOWER(meta->"$.tags")会把整个tags数组的所有元素转成小写,JSON_SEARCH在这个小写数组里查找转成小写的目标值,找到则返回非NULL,实现不区分大小写的完整匹配。

方法三:生成列优化查询(允许改表时用)

如果可以修改表结构,建议新增一个存储小写标签数组的生成列,后续查询会更高效:

-- 添加生成列
ALTER TABLE events ADD COLUMN tags_lower JSON GENERATED ALWAYS AS (LOWER(meta->"$.tags")) STORED;

-- 创建多值索引(MySQL 8.0.17+支持)
CREATE INDEX idx_tags_lower ON events((CAST(tags_lower AS JSON)));

-- 查询
SELECT *
FROM events
WHERE LOWER("Key1:VaLuE1") MEMBER OF (tags_lower);

生成列会自动同步原meta列的tags数据并转成小写,配合多值索引能大幅提升查询效率,适合频繁做这类搜索的场景。

为什么你之前的方法无效?

MEMBER OF直接比较JSON值时,会严格区分大小写,而且COLLATE无法直接作用于JSON类型的数组元素——因为JSON类型的排序规则是固定的,必须先把元素转换成普通字符串类型,才能指定排序规则做不区分大小写的比较。

内容的提问来源于stack exchange,提问作者hackel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:52:17