简体   繁体   English

将 JSON object 列值吐到雪花上的新列中(SQL)

[英]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.例如,我想要namepredictedlevelscore全部作为新列。

JSON 列内容

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 --- - trackingId: 0 名称: English predicated: 6 level: higher score: 6 1 1个 - trackingId: 0 - 跟踪 ID:0 trackingId: 0追踪编号:0 [ "trackingId", " 0" ] [ "trackingId", " 0" ] trackingId跟踪号码 0 0
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 --- - trackingId: 0 名称: English predicated: 6 level: higher score: 6 1 1个 name: English名称:英文 name: English名称:英文 [ "name", " English" ] [ "姓名", "英文" ] name名称 English英语 English英语
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 --- - trackingId: 0 名称: English predicated: 6 level: higher score: 6 1 1个 predicated: 6预测:6 predicated: 6预测:6 [ "predicated", " 6" ] [“预测”,“6”] predicated预测的 6 6个 6 6个
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 --- - trackingId: 0 名称: English predicated: 6 level: higher score: 6 1 1个 level: higher等级:较高 level: higher等级:较高 [ "level", " higher" ] [“水平”,“更高”] level等级 higher更高 higher更高
--- - trackingId: 0 name: English predicated: 6 level: higher score: 6 --- - trackingId: 0 名称: English predicated: 6 level: higher score: 6 1 1个 score: 6分数:6 score: 6分数:6 [ "score", " 6" ] [“得分”,“6”] score分数 6 6个 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 1个 English英语 6 6个 higher更高 6 6个

You can use the DOC to flatten the JSON data into different columns.您可以使用DOC将 JSON 数据展平到不同的列中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM