簡體   English   中英

Snowflake - 展平來自 json 變體列的多個嵌套數組值

[英]Snowflake - flatten multiple nested array values from json variant column

我有一個 JSON 數據,我想從中提取鍵“文本”的值,並在單行中分隔。 非常感謝任何幫助實現所需的 output 的幫助。

樣本 JSON 數據:

{
"expand": "schema,names",
"issues": [
        {
            "id": "123456",
            "key": "XYZ-123",
            "fields": {
                "customfield_10000": "abcd",
                "customfield_10001": 7,
                "customfield_10002": null,
                "description": {
                            "version": 1,
                            "type": "doc",
                            "content": [
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 1"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 2"
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 3",
                                            "marks": [
                                                {
                                                    "type": "link",
                                                    "attrs": {
                                                        "href": "some ref"
                                                    }
                                                }
                                            ]
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 4"
                                        }
                                    ]
                                },
                                {
                                    "type": "blockquote",
                                    "content": [
                                        {
                                            "type": "paragraph",
                                            "content": [
                                                {
                                                    "type": "text",
                                                    "text": "some text value 5"
                                                }
                                            ]
                                        },
                                        {
                                            "type": "paragraph",
                                            "content": [
                                                {
                                                    "type": "inlineCard",
                                                    "attrs": {
                                                        "url": "some url"
                                                    }
                                                },
                                                {
                                                    "type": "text",
                                                    "text": "some text value 6"
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 7"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 8"
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 9",
                                            "marks": [
                                                {
                                                    "type": "link",
                                                    "attrs": {
                                                        "href": "some link"
                                                    }
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 10"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 11"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 12"
                                        }
                                    ]
                            }
                        ]
                    }
                }
            }
        ]
}

所需的 output:

ISSUE_ID ISSUE_KEY CF_10000 CF_10001 CF_10002   DESCRIPTION
123456   XYZ-123   abcd     7        null       some text value 1|some text value 2|some text value 3.....

我正在使用以下查詢來獲取 arrays 值。 但是,我希望將 arrays 中的鍵“文本”值填充為上述所需格式。

    select
       ISSUE.value:id::number as ISSUE_ID,
       ISSUE.value:key::varchar as ISSUE_KEY,
       ISSUE.value:fields.customfield_10000::varchar as CF_10000,
       ISSUE.value:fields.customfield_10001::number as CF_10001,
       ISSUE.value:fields.customfield_10002::varchar as CF_10002,
       ISSUE.value:fields.description.content::varchar as DESCRIPTION
    from
       VARIANT_TABLE,
       lateral flatten( input => payload_json:issues, outer => true) as ISSUE

我創建了一個 UDF,用於將 JSON 數組 object 鍵值提取到數組的字符串中,但這並不能幫助我從上面共享的 JSON 中獲得所需的 output,因為它在對象內部嵌套了 arrays。

create or replace function UDF_ARRAY_OBJECT_TO_STRING_ARRAY(a array, b varchar)
returns array
language javascript
strict
comment = 'UDF to extract JSON array object key value into string of array. A refers to input array and B refers to extract which key from the array object'
as $$
return A.map(function(d) {return d[B]});
$$;

你那里的 arrays 比你在橫向展平中處理的要多得多。 有了更多的展平和一個 listagg() function,你應該可以做到這一點。 請注意,您可能需要按索引而不是字段值進行分組,具體取決於您要訪問的內容,但這會給出您在示例中尋找的結果:

WITH x AS (
SELECT parse_json('{
"expand": "schema,names",
"issues": [
        {
            "id": "123456",
            "key": "XYZ-123",
            "fields": {
                "customfield_10000": null,
                "customfield_10001": null,
                "customfield_10002": null,
                "description": {
                            "version": 1,
                            "type": "doc",
                            "content": [
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 1"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 2"
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 3",
                                            "marks": [
                                                {
                                                    "type": "link",
                                                    "attrs": {
                                                        "href": "some ref"
                                                    }
                                                }
                                            ]
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 4"
                                        }
                                    ]
                                },
                                {
                                    "type": "blockquote",
                                    "content": [
                                        {
                                            "type": "paragraph",
                                            "content": [
                                                {
                                                    "type": "text",
                                                    "text": "some text value 5"
                                                }
                                            ]
                                        },
                                        {
                                            "type": "paragraph",
                                            "content": [
                                                {
                                                    "type": "inlineCard",
                                                    "attrs": {
                                                        "url": "some url"
                                                    }
                                                },
                                                {
                                                    "type": "text",
                                                    "text": "some text value 6"
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 7"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 8"
                                        },
                                        {
                                            "type": "text",
                                            "text": "some text value 9",
                                            "marks": [
                                                {
                                                    "type": "link",
                                                    "attrs": {
                                                        "href": "some link"
                                                    }
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 10"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 11"
                                        }
                                    ]
                                },
                                {
                                    "type": "paragraph",
                                    "content": [
                                        {
                                            "type": "text",
                                            "text": "some text value 12"
                                        }
                                    ]
                            }
                        ]
                    }
                }
            }
        ]
}') as payload_json)
    select
       issue.value:id::number as ISSUE_ID,
       issue.value:key::varchar as ISSUE_KEY,
   ISSUE.value:fields.customfield_10000::varchar as CF_10000,
   ISSUE.value:fields.customfield_10001::number as CF_10001,
   ISSUE.value:fields.customfield_10002::varchar as CF_10002,
       listagg(content2.value:text::varchar,'|') as description
    from
       x,
       lateral flatten( input => x.payload_json:issues, outer => true) as issue,
       lateral flatten( input => issue.value:fields:description:content, outer => true) as content,
       lateral flatten( input => content.value:content, outer => true) as content2
    group by 1,2,3,4,5;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM