PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Еквивалентно на unpivot() в PostgreSQL

Създайте примерна таблица:

CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');

Можете да „отмените“ или „премахнете кръстосаната таблица“ с помощта на 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;

Това изпълнява 3 различни подзаявки на foo , по един за всяка колона, която искаме да отменим, и връща в една таблица всеки запис от всяка от подзаявките.

Но това ще сканира таблицата N пъти, където N е броят на колоните, които искате да отмените. Това е неефективно и е голям проблем, когато например работите с много голяма маса, сканирането на която отнема много време.

Вместо това използвайте:

SELECT id,
       unnest(array['a', 'b', 'c']) AS colname,
       unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;

Това е по-лесно за писане и ще сканира таблицата само веднъж.

array[a, b, c] връща обект на масив със стойностите на a, b и c като елементи.unnest(array[a, b, c]) разбива резултатите на един ред за всеки от елементите на масива.

Надявам се това да помогне!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамична колона в оператор SELECT postgres

  2. PostgreSQL - максимален брой параметри в IN клауза?

  3. Как да създадете Postgres таблица с уникален комбиниран първичен ключ?

  4. Автоматизиране на одитите на сигурността за PostgreSQL

  5. Намерете стойности, които не съдържат числа в PostgreSQL