如何在MariaDB中使用$.*通配符查询JSON列的任意键值?
在MariaDB中查询JSON多语言字段的正确方式
你的问题核心是MariaDB和MySQL对JSON路径$.*的处理逻辑存在差异:
- MySQL里用
name->'$.*'会返回所有JSON值组成的数组,转义后可直接用于模糊匹配; - 但MariaDB的
JSON_VALUE函数仅支持提取单个标量值,使用$.*时它只会返回第一个非空的JSON值(比如示例里的Professional Association),所以你的模糊匹配自然查不到目标内容。
下面是两种可行的解决方法:
方法1:用JSON_TABLE拆分JSON值为行
把JSON中的多语言值拆成单独的行,只要任意一个语言值符合条件,就返回原表记录:
SELECT t.* FROM some_table t JOIN JSON_TABLE( t.name, '$.*' COLUMNS( lang_content VARCHAR(255) PATH '$' ) ) AS lang_rows WHERE LOWER(lang_content) LIKE LOWER('%Berufsverband%');
方法2:用JSON_SEARCH判断字符串是否存在
利用JSON_SEARCH函数查找目标字符串在JSON中的路径,只要路径存在就说明匹配成功:
SELECT * FROM some_table WHERE JSON_SEARCH(name, 'one', '%Berufsverband%', NULL, '$.*') IS NOT NULL;
这里的'one'参数表示找到第一个匹配的路径即可,若需要匹配所有符合条件的记录,也可换成'all',判断逻辑保持不变。
内容的提问来源于stack exchange,提问作者Alejandro Tapia
相关产品推荐
相关产品推荐

