Utwórz przykładową tabelę:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Możesz „unpivot” lub „uncrosstab” za pomocą 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;
To uruchamia 3 różne podzapytania na foo
, po jednym dla każdej kolumny, którą chcemy przestawić, i zwraca w jednej tabeli każdy rekord z każdego podzapytania.
Ale to przeskanuje tabelę N razy, gdzie N to liczba kolumn, które chcesz przestawić. Jest to nieefektywne i stanowi duży problem, gdy na przykład pracujesz z bardzo dużą tabelą, której skanowanie zajmuje dużo czasu.
Zamiast tego użyj:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Jest to łatwiejsze do pisania i tylko raz zeskanuje tabelę.
array[a, b, c]
zwraca obiekt tablicy z wartościami a, b i c jako jego elementami.unnest(array[a, b, c])
dzieli wyniki na jeden wiersz dla każdego elementu tablicy.
Mam nadzieję, że to pomoże!