SQL 中 Flatten 的最佳 JSON 数组设置

Best JSON Array Set-up For Flatten in SQL

我需要编写一个简单的用户、组和 class 数组,最终将在 SQL 中解析并展平,以便用户、组和 class 每个列。我想知道实现此结果的最佳 JSON 数组和 SQL 语法?

编辑:已更新以显示数组而不是对象

目前,对于数组,我有:

[

 {   
  "user": "1",  
  "class"  : "a",
  "group"  : "a1" 
 },

 {   
  "user": "2",  
  "class"  : "b",
  "group"  : "b1" 
 }
]

对于SQL(雪花)我有

   with tab as (select parse_json(column1) as json
 from values(
   '[

{   
"user": "1",  
"class"  : "a",
"group"  : "a1" 
},

{   
"user": "2",  
"class"  : "b",
"group"  : "b1" 
}]'))
select * from tab,
lateral flatten(input => json) f

然而,这给了我一个 table 像:

| JSON | KEY | PATH | VALUE |
|------|-----|------|-------|
| {...}|     |[0]|  { "class": "a", "group": "a1", "user": "1" } |  
| {...}|     |[1]|  { "class": "b", "group": "b1", "user": "2" } |

最终,我想要的是

| JSON | user | class | group |
|------|------|-------|-------|
| {...}| 1    |     a |     a1|
| {...}| 2    |     b |     b1|

获得此结果的最佳 JSON 数组设置和 SQL 语法是什么?

UPDATE/ANSWER

结合以下两个建议,我得到了一个满意的答案:

with tab as (select parse_json(column1) as json
     from values(
       '[

    {   
    "user": "1",  
    "class"  : "a",
    "group"  : "a1" 
    },

    {   
    "user": "2",  
    "class"  : "b",
    "group"  : "b1" 
    }

]'))
    select json, value
    ,value:"user"::STRING  AS "user"
      ,value:class::STRING   AS class
      ,value:"group"::STRING AS "group"from tab,
    lateral flatten(input => json) f

FLATTEN 不是必需的。要访问特定的 key/value ::

with tab as (
   select parse_json(column1) as json
   from values(
       '{   "user": "1",  
        "class"  : "a",
        "group"       : "a1" }')
)
select json
      ,json:"user"::STRING  AS "user"
      ,json:class::STRING   AS class
      ,json:"group"::STRING AS "group"
from tab;

输出:

相关:JSON - Query Data

这不是一个数组,而是一个对象。

{   
"user": "1",  
"class"  : "a",
"group"  : "a1" 
}

为了它是一个数组,

[

    {   
    "user": "1",  
    "class"  : "a",
    "group"  : "a1" 
    },

    {   
    "user": "1",  
    "class"  : "a",
    "group"  : "a1" 
    }

]

现在这个 if dynamic could/sholud 被压平了。

但是如果您将其作为文件读取,您可能希望使用 Json 文件 tupe 和 strip outer set true。在这一点上,你只会被交给对象。所以不需要展平