【问题标题】:How to search nested JSON in MySQL如何在 MySQL 中搜索嵌套的 JSON
【发布时间】:2016-10-09 11:00:26
【问题描述】:

我正在使用带有原生 JSON 数据类型的 MySQL 5.7+。样本数据:

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

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

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

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

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

【问题讨论】:

    标签: mysql json


    【解决方案1】:
    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
    

    【讨论】:

    • 它不返回任何结果。使用 WHERE JSON_EXTRACT(data_column, '$[1].code') = 4 有效,但仍会硬编码对象索引。
    • 啊……我想我明白你要什么了……一秒钟。
    • Syntax error near 'JSON_EXTRACT(data_column, '$[*].code') ) WHERE row->code = 4' at line 8。您将如何修改 JSON 对象以使其更易于查询?
    • 啊...缺少引号。
    • 谢谢。引号仍然有错误。您的其他解决方案很有意义,但对于特定用例:查找代码。如果我想搜索stores.code = 400 所在的商店,然后选择整个code 对象怎么办。我最初的问题是在不知道深度嵌套 JSON 中的索引的情况下查找/选择对象。也许 JSON 数据类型不适合这个目的?
    【解决方案2】:

    这就是你要找的。

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

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

    【讨论】:

    • data_column->'$[*].code' like '%4%' 将匹配带有 4 的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多