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!