【问题标题】:I need to flatten JSON data in Snowflake Table1 table, in one JSON_DATA column that has an array我需要在一个 JSON_DATA 列中将 Snowflake Table1 表中的 JSON 数据展平,该列有一个数组
【发布时间】:2021-05-20 22:08:11
【问题描述】:

有人可以帮我创建一条 SQL 语句,将 Snowflake Table1 表中的 JSON 数据展平在一个具有数组的 JSON_DATA 列中吗?

JSON_DATA

{
    "scopes": [
        {
            "scope_name": "IN SCOPE",
            "company_code": "01",
            "lob_codes": ["01","07","09"]
        },
        {
            "scope_name": "IN SCOPE",
            "company_code": "02",
            "lob_codes": ["07","13","20"]
        },
        {
            "scope_name": "OUT OF SCOPE",
            "company_code": "01",
            "lob_codes": ["30","35","40"]
        },
        {
            "scope_name": "OUT OF SCOPE",
            "company_code": "02",
            "lob_codes": ["02","03","05"]
        }
        
    ]
}

我需要将其展平为:

|scope_name    |    company_code|   lob_codes|
|--------------|----------------|------------|
|IN SCOPE      |    1           |       01   |
|IN SCOPE      |    1           |       07   |
|IN SCOPE      |    1           |       09   |
|IN SCOPE      |    2           |       07   |
|IN SCOPE      |    2           |       13   |
|IN SCOPE      |    2           |       20   |
|OUT OF SCOPE  |    1           |       30   |
|OUT OF SCOPE  |    1           |       35   |
|OUT OF SCOPE  |    1           |       40   |
|OUT OF SCOPE  |    2           |       02   |
|OUT OF SCOPE  |    2           |       03   |
|OUT OF SCOPE  |    2           |       05   |

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    我相信您正在寻找类似的东西。关注最后的SELECT 语句。最重要的是模拟您提供的数据。

    WITH x AS (
    SELECT parse_json('{
        "scopes": [
            {
                "scope_name": "IN SCOPE",
                "company_code": "01",
                "lob_codes": ["01","07","09"]
            },
            {
                "scope_name": "IN SCOPE",
                "company_code": "02",
                "lob_codes": ["07","13","20"]
            },
            {
                "scope_name": "OUT OF SCOPE",
                "company_code": "01",
                "lob_codes": ["30","35","40"]
            },
            {
                "scope_name": "OUT OF SCOPE",
                "company_code": "02",
                "lob_codes": ["02","03","05"]
            }
            
        ]
    }') as json_data
    )
    SELECT
        y.value:company_code::varchar as company_code,
        y.value:scope_name::varchar as scope_name,
        z.value::varchar as lob_codes
    FROM x,
    LATERAL FLATTEN (input=>x.json_data:scopes) y,
    LATERAL FLATTEN (input=>y.value:lob_codes) z;
    

    【讨论】:

    • 完美,非常感谢迈克。这正是我想要的,但无法正确找到。
    • 一个快速说明:如果“lob_codes”数组可以为空(例如 []),并且在这种情况下需要返回具有 NULL lob_code 的行,您将需要在最终的 FLATTEN 中指定“OUTER => TRUE”(其行为类似于 OUTER JOIN 操作)。这在原帖中没有定义,所以不清楚这是否必要,但为了以防万一。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2014-12-18
    • 2012-09-20
    相关资源
    最近更新 更多