UNNEST句を使う
UNNEST句は、ネスト化された配列のネスト化を解除し、その親配列に結合するために使われます。
UNNESTキーワードの後には、ネスト化された配列を返す式を続ける必要があります。親のFROM句またはUNNEST句で指定された内包配列の子であることが必要です。
FROM parent_expression UNNEST child_expression
UNNEST句でASキーワードとINDEXキーワードを使用したり、複数の連続するUNNEST句を置いたりできます。
エイリアスのないUNNEST句を1つ以上使う時に、絶対パスがなくクエリーで使用されている識別子はすべて、最後のUNNEST句またはクエリー内の識別子が最後の句の一部ではない場合は、その親の句にある識別子の相対パスとして扱われます。
たとえば次の入力データでは:
{
"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
}
]
}
]
}
]
}
UNNEST句を2つ使って、同じレベル上のcustomers配列、orders配列、items配列内にあるデータを取得できます。
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
}
nameという識別子とquantityという識別子は一意であるため、配列エイリアスの先頭に付ける必要はありません。ただし、orders配列とitems配列の両方にidエレメントが含まれるため、エイリアスを使えば、どちらが返されるべきかを指定する必要があります。このクエリーは次の結果を返します:
[
{
"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
}
]