PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Setara dengan unpivot() di PostgreSQL

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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Optimasi Kueri di PostgreSQL. JELASKAN Dasar-dasar – Bagian 2

  2. Bagaimana Cos() Bekerja di PostgreSQL

  3. Skema PostgreSQL / Ruang Nama dengan Django

  4. Bagaimana cara mengatur ulang urutan di postgres dan mengisi kolom id dengan data baru?

  5. Cara Memformat Angka di PostgreSQL