Buat tabel contoh:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Anda dapat 'unpivot' atau 'uncrosstab' menggunakan 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;
Ini menjalankan 3 subkueri berbeda di foo
, satu untuk setiap kolom yang ingin kita unpivot, dan mengembalikan, dalam satu tabel, setiap record dari masing-masing subquery.
Tapi itu akan memindai tabel N kali, di mana N adalah jumlah kolom yang ingin Anda batalkan. Ini tidak efisien, dan menjadi masalah besar ketika, misalnya, Anda bekerja dengan tabel yang sangat besar yang membutuhkan waktu lama untuk memindai.
Sebagai gantinya, gunakan:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Ini lebih mudah untuk ditulis, dan hanya akan memindai tabel sekali.
array[a, b, c]
mengembalikan objek array, dengan nilai a, b, dan c sebagai elemennya.unnest(array[a, b, c])
memecah hasilnya menjadi satu baris untuk setiap elemen larik.
Semoga membantu!