我正在尝试将 json 数据插入雪花 table 但无法访问超过 1 级的嵌套行

I am trying to insert json data into a snowflake table but can't access nested rows of more than 1 level

json

{
    "payload": {
        "orders": [
            {
                "orderDetails": {
                    "billToParty": {
                        "partyId": "X"
                    },
                    "purchaseOrderDate": "X",
                    "deliveryWindow": "X",
                    "purchaseOrderStateChangedDate": "X",
                    "sellingParty": {
                        "partyId": "X"
                    },
                    "purchaseOrderType": "RegularOrder",
                    "paymentMethod": "Invoice",
                    "buyingParty": {
                        "partyId": "X"
                    },
                    "items": [
                        {
                            "orderedQuantity": {
                                "amount": 14,
                                "unitOfMeasure": "Cases",
                                "unitSize": 1
                            },
                            "netCost": {
                                "amount": "X",
                                "currencyCode": "USD"
                            },
                            "itemSequenceNumber": "1",
                            "amazonProductIdentifier": "X",
                            "vendorProductIdentifier": "X",
                            "isBackOrderAllowed": true,
                            "listPrice": {
                                "amount": "X",
                                "currencyCode": "USD"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

现在我可以使用像

这样的查询来获取所有派对 ID 行
SELECT t.value:orderDetails:buyingParty:partyId from table(flatten(input => parse_json(select parse_json(:payload:orders) from @avc_test_stage/test.json)))t;

但是我怎么能在一个查询中做这样的事情,因为我想最终将所有数据插入 table。

SELECT t.value:orderDetails:items:amazonProductIdentifier, t.value:orderDetails:buyingParty:partyId  from table(flatten(input => parse_json(select parse_json(:payload:orders) from @avc_test_stage/test.json)))t;

目前我得到的 items:amazonProductIdentifier 为空,因为它们在一行中的一行中。

items 是一个数组,因此您也需要将其展平。因此,利用 CTE 将您的示例定义为:

WITH x AS (
    SELECT parse_json('{
    "payload": {
        "orders": [
            {
                "orderDetails": {
                    "billToParty": {
                        "partyId": "X"
                    },
                    "purchaseOrderDate": "X",
                    "deliveryWindow": "X",
                    "purchaseOrderStateChangedDate": "X",
                    "sellingParty": {
                        "partyId": "X"
                    },
                    "purchaseOrderType": "RegularOrder",
                    "paymentMethod": "Invoice",
                    "buyingParty": {
                        "partyId": "X"
                    },
                    "items": [
                        {
                            "orderedQuantity": {
                                "amount": 14,
                                "unitOfMeasure": "Cases",
                                "unitSize": 1
                            },
                            "netCost": {
                                "amount": "X",
                                "currencyCode": "USD"
                            },
                            "itemSequenceNumber": "1",
                            "amazonProductIdentifier": "X",
                            "vendorProductIdentifier": "X",
                            "isBackOrderAllowed": true,
                            "listPrice": {
                                "amount": "X",
                                "currencyCode": "USD"
                            }
                        }
                    ]
                }
            }
        ]
    }
}') as var)

您的 amazonProductIdentifier 的 select 部分将是第二个横向展平的一部分,如下所示:

SELECT z.value:amazonProductIdentifier::varchar
FROM x,
LATERAL FLATTEN(input=>x.var:payload:orders) y,
LATERAL FLATTEN(input=>y.value:orderDetails:items) z;