[英]spit JSON object column values into new columns on snowflake ( SQL )
I want to split a json column that has multiple values as shown in the picture below into new columns.我想将具有多个值的 json 列拆分为新列,如下图所示。 I'm using snowflake cause that's where the data is located.
我正在使用雪花,因为那是数据所在的位置。
like for example, I want name
, predicted
, level
, score
all as new column.例如,我想要
name
、 predicted
、 level
、 score
全部作为新列。
So with this CTE to provide the input/data:因此,使用此 CTE 来提供输入/数据:
with data as (
SELECT '---
- trackingId: 0
name: English
predicated: 6
level: higher
score: 6' as subjects
)
lets strip that in parts:让我们把它分成几部分:
select d.*
,s.seq
,s.value as raw
,trim(trim(s.value,'-'),' ') as trimmed
,split(trimmed,':') as parts
,trim(parts[0]) as key
,trim(parts[1]) as val
,iff(key='name', val,null) as name
,iff(key='predicated', val,null) as predicated
,iff(key='level', val,null) as level
,iff(key='score', val,null) as score
from data as d,
table(split_to_table(d.subjects, '\n')) s
where trimmed <> ''
gives:给出:
SUBJECTS![]() |
SEQ![]() |
RAW![]() |
TRIMMED![]() |
PARTS![]() |
KEY![]() |
VAL![]() |
NAME![]() |
PREDICATED![]() |
LEVEL![]() |
SCORE![]() |
---|---|---|---|---|---|---|---|---|---|---|
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 ![]() |
1 ![]() |
- trackingId: 0 ![]() |
trackingId: 0![]() |
[ "trackingId", " 0" ] ![]() |
trackingId![]() |
0 ![]() |
||||
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 ![]() |
1 ![]() |
name: English![]() |
name: English![]() |
[ "name", " English" ] ![]() |
name![]() |
English![]() |
English![]() |
|||
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 ![]() |
1 ![]() |
predicated: 6![]() |
predicated: 6![]() |
[ "predicated", " 6" ] ![]() |
predicated![]() |
6 ![]() |
6 ![]() |
|||
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 ![]() |
1 ![]() |
level: higher![]() |
level: higher![]() |
[ "level", " higher" ] ![]() |
level![]() |
higher![]() |
higher![]() |
|||
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 ![]() |
1 ![]() |
score: 6![]() |
score: 6![]() |
[ "score", " 6" ] ![]() |
score![]() |
6 ![]() |
6 ![]() |
So we can then roll that back up:所以我们可以将其回滚:
select seq
,max(name) as name
,max(predicated) as predicated
,max(level) as level
,max(score) as score
from (
select d.*
,s.seq
,trim(trim(s.value,'-'),' ') as trimmed
,split(trimmed,':') as parts
,trim(parts[0]) as key
,trim(parts[1]) as val
,iff(key='name', val,null) as name
,iff(key='predicated', val,null) as predicated
,iff(key='level', val,null) as level
,iff(key='score', val,null) as score
from data as d,
table(split_to_table(d.subjects, '\n')) s
where trimmed <> ''
)
group by seq;
giving:给予:
SEQ![]() |
NAME![]() |
PREDICATED![]() |
LEVEL![]() |
SCORE![]() |
---|---|---|---|---|
1 ![]() |
English![]() |
6 ![]() |
higher![]() |
6 ![]() |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.