Opret en eksempeltabel:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Du kan 'unpivot' eller 'uncrosstab' ved hjælp af 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;
Dette kører 3 forskellige underforespørgsler på foo
, en for hver kolonne, vi ønsker at fjerne pivot, og returnerer, i én tabel, hver post fra hver af underforespørgslerne.
Men det vil scanne tabellen N gange, hvor N er antallet af kolonner, du vil deaktivere. Dette er ineffektivt og et stort problem, når du for eksempel arbejder med en meget stor tabel, der tager lang tid at scanne.
Brug i stedet:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Dette er nemmere at skrive, og det scanner kun tabellen én gang.
array[a, b, c]
returnerer et array-objekt med værdierne a, b og c som dets elementer.unnest(array[a, b, c])
opdeler resultaterne i én række for hvert af arrayets elementer.
Håber det hjælper!