PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Equivalente a unpivot() in PostgreSQL

Crea una tabella di esempio:

CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');

Puoi 'unpivot' o 'uncrosstab' utilizzando UNION ALL:

SELECT id,
       'a' AS colname,
       a AS thing
FROM foo
UNION ALL
SELECT id,
       'b' AS colname, 
       b AS thing
FROM foo
UNION ALL
SELECT id, 
       'c' AS colname,
       c AS thing
FROM foo
ORDER BY id;

Questo esegue 3 diverse sottoquery su foo , uno per ogni colonna che vogliamo annullare il pivot e restituisce, in una tabella, ogni record di ciascuna delle sottoquery.

Ma ciò analizzerà la tabella N volte, dove N è il numero di colonne che vuoi annullare. Questo è inefficiente e rappresenta un grosso problema quando, ad esempio, lavori con una tabella molto grande che richiede molto tempo per la scansione.

Invece, usa:

SELECT id,
       unnest(array['a', 'b', 'c']) AS colname,
       unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;

È più facile da scrivere e analizzerà la tabella solo una volta.

array[a, b, c] restituisce un oggetto array, con i valori di a, b e c come elementi.unnest(array[a, b, c]) suddivide i risultati in una riga per ciascuno degli elementi dell'array.

Spero di esserti stato d'aiuto!