sql >> Database >  >> RDS >> PostgreSQL

Gelijk aan unpivot() in PostgreSQL

Maak een voorbeeldtabel:

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

U kunt de draaiing ongedaan maken of de kruistabel opheffen met 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;

Dit voert 3 verschillende subquery's uit op foo , één voor elke kolom die we ongedaan willen maken, en retourneert in één tabel elk record van elk van de subquery's.

Maar dat zal de tabel N keer scannen, waarbij N het aantal kolommen is dat u wilt ongedaan maken. Dit is inefficiënt en een groot probleem wanneer u bijvoorbeeld werkt met een zeer grote tabel die veel tijd kost om te scannen.

Gebruik in plaats daarvan:

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

Dit is gemakkelijker te schrijven en het zal de tabel maar één keer scannen.

array[a, b, c] geeft een array-object terug, met de waarden van a, b en c als elementen.unnest(array[a, b, c]) verdeelt de resultaten in één rij voor elk van de elementen van de array.

Ik hoop dat dat helpt!



  1. Implementeer meerdere Oracle-rekeninstanties met behulp van een instantiepool en terraform

  2. Lokale tijdelijke tabel in Oracle 10 (voor de reikwijdte van Stored Procedure)

  3. Bestaat / bestaat niet:'selecteer 1' vs 'selecteer veld'

  4. retourwaarde op een positie van STRING_SPLIT in SQL Server 2016