繁体   English   中英

如何在MySQL中搜索嵌套的JSON

[英]How to search nested JSON in MySQL

我正在使用 MySQL 5.7+ 和本机 JSON 数据类型。 样本数据:

[
  {
    "code": 2,
    "stores": [
      {
        "code": 100,
        "quantity": 2
      },
      {
        "code": 200,
        "quantity": 3
      }
    ]
  },
  {
    "code": 4,
    "stores": [
      {
        "code": 300,
        "quantity": 4
      },
      {
        "code": 400,
        "quantity": 5
      }
    ]
  }
]

问题:如何提取code = 4的数组?

以下(工作)查询具有我要提取的数据的 position 和硬编码的搜索条件:

SELECT JSON_EXTRACT(data_column, '$[0]') 
FROM   json_data_table
WHERE  data_column->'$[1].code' = 4

我尝试使用通配符 ( data_column->'$[*].code' = 4 ) 但我没有得到任何结果。

SELECT row FROM 
(
    SELECT data_column->"[*]" as row
    FROM   json_data_table
    WHERE  4 IN JSON_EXTRACT(data_column, '$[*].code')
) 
WHERE row->".code" = 4

...虽然如果这不是顶级的未索引对象数组,这将更容易使用。 您可能需要考虑对架构进行一些调整。

注意:

如果您的数据中有多行,指定"$[i]"将选择该行,而不是它的聚合。 对于您的数据集, "$[1].code"将始终评估为该单行中code的值。

基本上,你是在说:

  1. $ json 集合
  2. [1]集合中的第二个对象。
  3. .code属性标记为“代码”。

...因为该查询只会有一个匹配项,所以它总是 eval 为 4 ...

  1. WHERE 4 = 4

如果可能,替代数据结构

既然“代码”的全部目的是作为一把钥匙,那就让它成为钥匙。

[
  "code2":{
    "stores": [
      {
        "code": 100,
        "quantity": 2
      },
      {
        "code": 200,
        "quantity": 3
      }
    ]
  },
  "code4": {
    "stores": [
      {
        "code": 300,
        "quantity": 4
      },
      {
        "code": 400,
        "quantity": 5
      }
    ]
  }
]

那么,它所需要的只是:

SELECT datacolumn->"[code4]" as code4
FROM json_data_table

如果要获取 mysql 中的嵌套 json,则列中必须存在有效​​的 json。 那么你可以试试

JSON_EXTRACT(json_column,'$.level1.$level1.2') from table;

获取完整示例

访问完整代码

这就是你要找的。

SELECT data_column->'$[*]' FROM json_data_table where data_column->'$[*].code' like '%4%'

从数组中选择时,所选数据将有[]周围,​​因此data_column->'$[*].code' = 4是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM