PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Équivalent à unpivot() dans PostgreSQL

Créez un exemple de tableau :

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

Vous pouvez 'unpivot' ou 'uncrosstab' en utilisant 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;

Cela exécute 3 sous-requêtes différentes sur foo , un pour chaque colonne que nous voulons annuler le pivot, et renvoie, dans une table, chaque enregistrement de chacune des sous-requêtes.

Mais cela analysera la table N fois, où N est le nombre de colonnes que vous souhaitez annuler le pivot. Ceci est inefficace et constitue un gros problème lorsque, par exemple, vous travaillez avec une très grande table dont l'analyse prend beaucoup de temps.

À la place, utilisez :

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

C'est plus facile à écrire et cela ne parcourra la table qu'une seule fois.

array[a, b, c] renvoie un objet tableau, avec les valeurs de a, b et c comme éléments.unnest(array[a, b, c]) divise les résultats en une ligne pour chacun des éléments du tableau.

J'espère que ça aide !