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;
输出:
这不是一个数组,而是一个对象。
{
"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。在这一点上,你只会被交给对象。所以不需要展平
我需要编写一个简单的用户、组和 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;
输出:
这不是一个数组,而是一个对象。
{
"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。在这一点上,你只会被交给对象。所以不需要展平