Snowflake/SQL - 嵌套 json 对象和数组

问题描述 投票:0回答:1

我陷入困境 - 我有一个 json 文件,其中包含一些嵌套的 json 对象和数组,但我不知道如何正确查询这些数据。

{
  "dim":[
    "ENT1",
    "ENT2",
    "ENT3",
    "ENT4"
  ],
  "col":[
    [
      "ST1",
      "ST2",
      "ST3"
    ]
  ],
  "row":[
    {
      "head":[
        "AC1"
      ],
      "data":[
        "1",
        "2",
        "3"
      ]
    },
    {
      "head":[
        "AC2"
      ],
      "data":[
        "4",
        "5",
        "6"
      ]
    },
    {
      "head":[
        "AC3"
      ],
      "data":[
        "7",
        "8",
        "9"
      ]
    }
  ]
}

以下是预期结果:

ENT1, ENT2, ENT3, ENT4, ST1, AC1, 1
ENT1, ENT2, ENT3, ENT4, ST1, AC2, 4
ENT1, ENT2, ENT3, ENT4, ST1, AC3, 7
ENT1, ENT2, ENT3, ENT4, ST2, AC1, 2
ENT1, ENT2, ENT3, ENT4, ST2, AC2, 5
ENT1, ENT2, ENT3, ENT4, ST2, AC3, 8
ENT1, ENT2, ENT3, ENT4, ST3, AC1, 3
ENT1, ENT2, ENT3, ENT4, ST3, AC2, 6
ENT1, ENT2, ENT3, ENT4, ST3, AC3, 9

以下是我收到的结果:

ENT1, ENT2, ENT3, ENT4, ST1, AC1, 1
ENT1, ENT2, ENT3, ENT4, ST1, AC1, 2
ENT1, ENT2, ENT3, ENT4, ST1, AC1, 3
ENT1, ENT2, ENT3, ENT4, ST1, AC2, 4
ENT1, ENT2, ENT3, ENT4, ST1, AC2, 5
ENT1, ENT2, ENT3, ENT4, ST1, AC2, 6
ENT1, ENT2, ENT3, ENT4, ST1, AC3, 7
ENT1, ENT2, ENT3, ENT4, ST1, AC3, 8
ENT1, ENT2, ENT3, ENT4, ST1, AC3, 9
ENT1, ENT2, ENT3, ENT4, ST2, AC1, 1
ENT1, ENT2, ENT3, ENT4, ST2, AC1, 2
ENT1, ENT2, ENT3, ENT4, ST2, AC1, 3
ENT1, ENT2, ENT3, ENT4, ST2, AC2, 4
ENT1, ENT2, ENT3, ENT4, ST2, AC2, 5
ENT1, ENT2, ENT3, ENT4, ST2, AC2, 6
ENT1, ENT2, ENT3, ENT4, ST2, AC3, 7
ENT1, ENT2, ENT3, ENT4, ST2, AC3, 8
ENT1, ENT2, ENT3, ENT4, ST2, AC3, 9
ENT1, ENT2, ENT3, ENT4, ST3, AC1, 1
ENT1, ENT2, ENT3, ENT4, ST3, AC1, 2
ENT1, ENT2, ENT3, ENT4, ST3, AC1, 3
ENT1, ENT2, ENT3, ENT4, ST3, AC2, 4
ENT1, ENT2, ENT3, ENT4, ST3, AC2, 5
ENT1, ENT2, ENT3, ENT4, ST3, AC2, 6
ENT1, ENT2, ENT3, ENT4, ST3, AC3, 7
ENT1, ENT2, ENT3, ENT4, ST3, AC3, 8
ENT1, ENT2, ENT3, ENT4, ST3, AC3, 9

这是我的疑问:

`SELECT t.$1:dim[0]::string AS pov1,
t.$1:dim[1]::string AS pov2,
t.$1:dim[2]::string AS pov3,
t.$1:dim[3]::string AS pov4,
s.value::string AS st,
a.value:head::string AS ac,
am.value::string AS at
FROM my_table t
, table(flatten( input => array_flatten(t.$1:col) ) s
, lateral flatten ( input => t.$1:row ) a
, table(flatten( input => a.value:data)) am;`

我的 SQL 技能不是很好,所以如果有人能启发我,我将不胜感激。

sql arrays json nested snowflake-cloud-data-platform
1个回答
0
投票

不清楚你想要什么,但从你的输出看来,你试图获取特定列索引处的行值。如果是这种情况,雪花会从扁平数组中提供大量元信息,包括元素的index

因此,您可以仅使用列数组索引来获取相应行的数据,甚至无需创建另一个表别名,因为您已经有行了。

SELECT t.$1:dim[0]::string AS pov1,
  t.$1:dim[1]::string AS pov2,
  t.$1:dim[2]::string AS pov3,
  t.$1:dim[3]::string AS pov4,
  s.value::string AS st,
  a.value:head::string AS ac,
  a.value:data[s.index] AS at -- Get the data value corresponding to the column's index
FROM my_table t
  , table(flatten( input => array_flatten(t.$1:col) )) s
  , lateral flatten ( input => t.$1:row ) a
© www.soinside.com 2019 - 2024. All rights reserved.