La clause UNNEST
est utilisée pour désimbriquer un tableau imbriqué et effectuer une jointure entre elle et son tableau parent.
Le mot-clé
UNNEST
doit être suivi de l'expression retournant le tableau imbriqué. Il doit être un enfant du tableau imbriquant spécifié dans la clause FROM
ou UNNEST
parente :FROM parent_expression UNNEST child_expression
Vous pouvez utiliser les mots-clés AS
et INDEX
dans la clause UNNEST
. Vous pouvez également avoir plusieurs clauses UNNEST
consécutives.
Lors de l'utilisation d'une ou de plusieurs clause·s UNNEST
sans alias, tous les identifiants utilisés dans la requête sans chemin absolu sont traités comme étant relatifs à l'identifiant dans la dernière clause UNNEST
ou à sa clause parente si un identifiant dans la requête ne fait pas partie de la dernière clause.
Par exemple, avec les données d'entrée suivantes :
{
"customers":[
{
"name":"John Smith",
"orders":[
{
"id":"abc-12345",
"items":[
{
"id":"97516848-jiargn",
"quantity":2
}
]
}
]
},
{
"name":"Jane Doe",
"orders":[
{
"id":"def-12345",
"items":[
{
"id":"97516848-kftesn",
"quantity":3
},
{
"id":"96946848-metasb",
"quantity":1
}
]
}
]
}
]
}
Vous pouvez utiliser deux clauses
UNNEST
pour obtenir les données dans les tableaux customers
, orders
et items
au même niveau :FROM customers UNNEST orders AS o UNNEST items AS i
SELECT {
customer_name = name,
order_id = o.id,
item_id = i.id,
item_quantity = quantity
}
Comme les identifiants
name
et quantity
sont uniques, il n'est pas nécessaire qu'ils contiennent un préfixe avec l'alias du tableau. Cependant, comme les deux tableaux orders
et items
contiennent un élément id
, vous devez utiliser l'alias pour spécifier lequel doit être retourné. Cette requête retourne le résultat suivant :[
{
"customer_name":"John Smith",
"order_id":"abc-12345",
"item_id":"97516848-jiargn",
"item_quantity":2
},
{
"customer_name":"Jane Doe",
"order_id":"def-12345",
"item_id":"97516848-kftesn",
"item_quantity":3
},
{
"customer_name":"Jane Doe",
"order_id":"def-12345",
"item_id":"96946848-metasb",
"item_quantity":1
}
]