[英]Snowflake - flatten multiple nested array values from json variant column
[英]Lateral flatten array with multiple JSON objects in Snowflake
我有一個包含多個JSON對象的數組。 位於表中的任何JSON數組中的最大元素數為8。
這是數組原始值的示例:
variants
----------------------------------------------------------------
[
{
"id": 12388362846279,
"inventory_quantity": 10,
"sku": “sku1”
},
{
"id": 12388391387207,
"inventory_quantity": 31,
"sku": “sku2”
},
{
"id": 12394420142151,
"inventory_quantity": 12,
"sku": “sku3”
},
{
"id": 12394426007623,
"inventory_quantity": 4,
"sku": “sku4”
},
{
"id": 12394429022279,
"inventory_quantity": 9,
"sku": “sku5”
},
{
"id": 12394431414343,
"inventory_quantity": 15,
"sku": “sku6”
},
{
"id": 12394455597127,
"inventory_quantity": 22,
"sku": “sku7”
},
{
"id": 12394459856967,
"inventory_quantity": 0,
"sku": “sku8”
}
]
我的查詢嘗試展平並解析數組以為每個對象返回一行:
select
variants[0]:sku,
variants[0]:inventory_quantity,
variants[1]:sku,
variants[1]:inventory_quantity,
variants[2]:sku,
variants[2]:inventory_quantity,
variants[3]:sku,
variants[3]:inventory_quantity,
variants[4]:sku,
variants[4]:inventory_quantity,
variants[5]:sku,
variants[5]:inventory_quantity,
variants[6]:sku,
variants[6]:inventory_quantity,
variants[7]:sku,
variants[7]:inventory_quantity
from table
, lateral flatten(input => variants)
但是,我的輸出返回重復/重復的值:
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
| sku1 | 10 | sku2 | 31 | sku3 | 12 | sku4 | 4 | sku5 | 9 | sku6 | 15 | sku7 | 22 | sku8 | 0 |
+------+----+------+----+------+----+------+---+------+---+------+----+------+----+------+---+
我希望我的輸出看起來類似於以下內容:
+------+----+
| sku1 | 10 |
+------+----+
| sku2 | 31 |
+------+----+
| sku3 | 12 |
+------+----+
| sku4 | 4 |
+------+----+
| sku5 | 9 |
+------+----+
| sku6 | 15 |
+------+----+
| sku7 | 22 |
+------+----+
| sku8 | 0 |
+------+----+
使用LATERAL FLATTEN不需要顯式引用數組位置。 數組的每個成員成為其自己的行。 因此,要獲得上面想要的結果,只需使用:
select v.value:sku::varchar,
v.value:inventory_quantity
from table,
lateral flatten(input => table.variants) v
;
如果表中的某些列在每行中要引用的數組之外,只需將它們包括在SELECT中。 本質上,將數組中平展的行隱式“連接”到表的非嵌套列...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.