Esempi di UNNEST - Amazon Redshift

Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dal 1º novembre 2025. Se desideri utilizzare le UDF Python, creale prima di tale data. Le UDF Python esistenti continueranno a funzionare normalmente. Per ulteriori informazioni, consulta il post del blog.

Esempi di UNNEST

UNNEST è un parametro della clausola FROM che espande i dati annidati in colonne che contengono gli elementi non annidati dei dati. Per informazioni sull’annullamento dell’annidamento, consulta Query sui dati semistrutturati.

L’istruzione seguente crea e popola la tabella orders, che contiene una colonna products contenente gli array degli ID prodotto. Gli esempi in questa sezione utilizzano i dati di esempio riportati in questa tabella.

CREATE TABLE orders ( order_id INT, products SUPER ); -- Populate table INSERT INTO orders VALUES (1001, JSON_PARSE('[ { "product_id": "P456", "name": "Monitor", "price": 299.99, "quantity": 1, "specs": { "size": "27 inch", "resolution": "4K" } } ] ')), (1002, JSON_PARSE(' [ { "product_id": "P567", "name": "USB Cable", "price": 9.99, "quantity": 3 }, { "product_id": "P678", "name": "Headphones", "price": 159.99, "quantity": 1, "specs": { "type": "Wireless", "battery_life": "20 hours" } } ] '));

Di seguito sono riportati alcuni esempi di annullamento dell’annullamento delle query con i dati di esempio utilizzando la sintassi PartiQL.

Annullamento dell’annidamento di un array senza una colonna OFFSET

La seguente query annulla l’annidamento degli array SUPER nella colonna dei prodotti, in cui ogni riga rappresenta un articolo dell’ordine in order_id.

SELECT o.order_id, unnested_products.product FROM orders o, UNNEST(o.products) AS unnested_products(product); order_id | product ----------+----------------------------------------------------------------------------------------------------------------------------- 1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}} 1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3} 1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} (3 rows)

La seguente query trova il prodotto più costoso in ciascun ordine.

SELECT o.order_id, MAX(unnested_products.product) FROM orders o, UNNEST(o.products) AS unnested_products(product); order_id | product ----------+----------------------------------------------------------------------------------------------------------------------------- 1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}} 1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} (2 rows)

Annullamento dell’annidamento di un array con una colonna OFFSET implicita

La seguente query utilizza il parametro UNNEST ... WITH OFFSET per mostrare la posizione a base zero di ogni prodotto all’interno del relativo array di ordini.

SELECT o.order_id, up.product, up.offset_col FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product); order_id | product | offset_col ----------+-----------------------------------------------------------------------------------------------------------------------------+------------ 1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}} | 0 1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3} | 0 1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} | 1 (3 rows)

Poiché l’istruzione non specifica un alias per la colonna offset, per impostazione predefinita Amazon Redshift le assegna il nome offset_col.

Annullamento dell’annidamento di un array con una colonna di OFFSET esplicita

La seguente query utilizza il parametro UNNEST ... WITH OFFSET anche per mostrare i prodotti all’interno degli array degli ordini. La differenza tra questa query rispetto alla query dell’esempio precedente è che nomina esplicitamente la colonna di offset con l’alias idx.

SELECT o.order_id, up.product, up.idx FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product, idx); order_id | product | idx ----------+-----------------------------------------------------------------------------------------------------------------------------+----- 1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}} | 0 1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3} | 0 1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} | 1 (3 rows)