如何在MySQL中搜索嵌套的JSON

时间:2016-06-09 00:16:23

标签: mysql json

我使用MySQL 5.7+和原生JSON数据类型。样本数据:

 Sub Changecolortest5()
'
' Changecolortest5 Macro
'
'
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    Do
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
    Selection.Font.Color = 8527984
    ActiveWindow.ActivePane.View.NextHeaderFooter
    Loop
'Exit Header and Footer
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End Sub

问题:如何在[ { "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 ),但我没有收到任何结果。

2 个答案:

答案 0 :(得分: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 collection
  2. [1]集合中的第二个对象。
  3. .code属性标记为&#34;代码&#34;。
  4. ...因为该查询只会有一个匹配,所以它总是eval到4 ...

    1. WHERE 4 = 4
    2. 备用数据结构(如果可能)

      由于&#34;代码&#34;的全部目的作为关键,把它作为关键。

      [
        "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
      

答案 1 :(得分:-1)

这就是您要寻找的。

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

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