PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Entspricht unpivot() in PostgreSQL

Erstellen Sie eine Beispieltabelle:

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

Mit UNION ALL:

können Sie die Pivotierung aufheben oder die Kreuztabelle aufheben
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;

Dies führt 3 verschiedene Unterabfragen auf foo aus , eine für jede Spalte, deren Pivotierung aufgehoben werden soll, und gibt in einer Tabelle jeden Datensatz aus jeder der Unterabfragen zurück.

Aber dadurch wird die Tabelle N-mal gescannt, wobei N die Anzahl der Spalten ist, die Sie entpivotieren möchten. Dies ist ineffizient und ein großes Problem, wenn Sie beispielsweise mit einer sehr großen Tabelle arbeiten, deren Scan lange dauert.

Verwenden Sie stattdessen:

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

Dies ist einfacher zu schreiben und scannt die Tabelle nur einmal.

array[a, b, c] gibt ein Array-Objekt mit den Werten von a, b und c als Elemente zurück.unnest(array[a, b, c]) zerlegt die Ergebnisse in eine Zeile für jedes Element des Arrays.

Hoffe das hilft!