我正在尝试将 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;
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;