Vytvořte příklad tabulky:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Můžete 'unpivot' nebo 'uncrosstab' 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 spustí 3 různé dílčí dotazy na foo
, jeden pro každý sloupec, který chceme zrušit, a vrátí v jedné tabulce každý záznam z každého poddotazu.
Ale to prohledá tabulku N-krát, kde N je počet sloupců, které chcete uvolnit. To je neefektivní a je to velký problém, když například pracujete s velmi velkým stolem, jehož skenování trvá dlouho.
Místo toho použijte:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
To se snadněji píše a tabulku to naskenuje pouze jednou.
array[a, b, c]
vrátí objekt pole s hodnotami a, b a c jako prvky.unnest(array[a, b, c])
rozdělí výsledky do jednoho řádku pro každý z prvků pole.
Doufám, že to pomůže!