如何查询JSON列中嵌套存储为字符串的数组内的指定值?
你当前写法不生效的根本原因是嵌套的array字段存储的是转义后的JSON字符串,不是JSON列的原生结构,whereJsonContains只能识别JSON列里的原生JSON层级,没法解析嵌套在字符串里的JSON内容。
以下是按优先级排序的可落地方案:
1. 最优方案:调整存储逻辑
存入数据时不要把内层array序列化为字符串,直接作为JSON结构存入,此时你原来的查询写法稍作调整就可以正常生效,性能最高,也符合JSON列的使用规范。
2. 不改动现有存储结构的SQL级查询方案
可以用数据库原生的JSON函数嵌套解析内层字符串,不需要先把全量数据查出来处理,以MySQL为例,Laravel中可以这么写:
$specific_value = '3'; // 替换为你的目标查询值 ExampleTable::whereRaw( 'JSON_CONTAINS( JSON_UNQUOTE(JSON_EXTRACT(example_column, "$.multidimensional_array.table[0].attributes.array")), ? ) = 1', ['"' . $specific_value . '"'] )->get();
原理是先通过JSON_EXTRACT提取到内层的字符串值,用JSON_UNQUOTE去掉外层引号转成合法JSON,再调用JSON_CONTAINS做包含判断。
3. 全量查询后遍历方案
仅当数据量极小时可以使用,性能最差不推荐:
// 先筛选出存在multidimensional_array的记录 $records = ExampleTable::whereNotNull('example_column->multidimensional_array')->get(); // 遍历解析内层字符串做匹配 $targetRecords = $records->filter(function ($item) use ($specific_value) { $nestedArray = json_decode($item->example_column['multidimensional_array']['table'][0]['attributes']['array'], true); return in_array($specific_value, $nestedArray ?? []); });
内容的提问来源于stack exchange,提问作者nikname
相关产品推荐
相关产品推荐

