sql >> Database teknologi >  >> RDS >> PostgreSQL

Svarer til unpivot() i PostgreSQL

Opret en eksempeltabel:

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' ved hjælp af 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;

Dette kører 3 forskellige underforespørgsler på foo , en for hver kolonne, vi ønsker at fjerne pivot, og returnerer, i én tabel, hver post fra hver af underforespørgslerne.

Men det vil scanne tabellen N gange, hvor N er antallet af kolonner, du vil deaktivere. Dette er ineffektivt og et stort problem, når du for eksempel arbejder med en meget stor tabel, der tager lang tid at scanne.

Brug i stedet:

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

Dette er nemmere at skrive, og det scanner kun tabellen én gang.

array[a, b, c] returnerer et array-objekt med værdierne a, b og c som dets elementer.unnest(array[a, b, c]) opdeler resultaterne i én række for hvert af arrayets elementer.

Håber det hjælper!



  1. Java - find den første årsag til en undtagelse

  2. Hvordan opretter man indeks på JSON-feltet i Postgres?

  3. Skabelonmønstre og modifikatorer til numerisk formatering i PostgreSQL

  4. SSIS - værdien kan ikke konverteres på grund af et potentielt tab af data