sql >> Databasteknik >  >> RDS >> PostgreSQL

Motsvarar unpivot() i PostgreSQL

Skapa en exempeltabell:

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

Du kan 'unpivot' eller 'uncrosstab' med 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;

Detta kör 3 olika underfrågor på foo , en för varje kolumn vi vill avpivotera, och returnerar, i en tabell, varje post från var och en av underfrågorna.

Men det kommer att skanna tabellen N gånger, där N är antalet kolumner som du vill avpivotera. Detta är ineffektivt och ett stort problem när du till exempel arbetar med en mycket stor tabell som tar lång tid att skanna.

Använd istället:

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

Detta är lättare att skriva, och det kommer bara att skanna tabellen en gång.

array[a, b, c] returnerar ett arrayobjekt med värdena a, b och c som dess element.unnest(array[a, b, c]) delar upp resultaten i en rad för vart och ett av arrayens element.

Hoppas det hjälper!



  1. mySQL konvertera varchar till datum

  2. Transponera rader och kolumner utan aggregat

  3. Betygsätt din databas Performance Monitoring Setup

  4. SQL-serverlogg, leverans och katastrofåterställning, installation och konfiguration -2