PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Odpowiednik unpivot() w PostgreSQL

Utwórz przykładową tabelę:

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

Możesz „unpivot” lub „uncrosstab” za 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 uruchamia 3 różne podzapytania na foo , po jednym dla każdej kolumny, którą chcemy przestawić, i zwraca w jednej tabeli każdy rekord z każdego podzapytania.

Ale to przeskanuje tabelę N razy, gdzie N to liczba kolumn, które chcesz przestawić. Jest to nieefektywne i stanowi duży problem, gdy na przykład pracujesz z bardzo dużą tabelą, której skanowanie zajmuje dużo czasu.

Zamiast tego użyj:

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

Jest to łatwiejsze do pisania i tylko raz zeskanuje tabelę.

array[a, b, c] zwraca obiekt tablicy z wartościami a, b i c jako jego elementami.unnest(array[a, b, c]) dzieli wyniki na jeden wiersz dla każdego elementu tablicy.

Mam nadzieję, że to pomoże!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz aplikację na iPhone'a z PostgreSQL za pomocą Libpq

  2. Wyjaśnienie JSONB wprowadzone przez PostgreSQL

  3. Co nowego w PgBouncerze 1.6

  4. Jak mogę się zalogować i uwierzytelnić w Postgresql po nowej instalacji?

  5. Przechowywanie zaszyfrowanych danych w Postgres