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

如何查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:00