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

PostgreSQL ligne vers colonnes

Tout d'abord, le crosstab() famille de fonctions n'est pas installée dans PostgreSQL standard. Vous devez installer l'extension tablefunc pour ça. Dans PostgreSQL 9.1, vous feriez simplement :

CREATE EXTENSION tablefunc;

Pour les versions plus anciennes, consultez cette réponse connexe.

Requête

La requête pourrait ressembler à ceci :

SELECT *
FROM   crosstab (
        'SELECT l.id
               ,c.column_name
               ,c.data
         FROM   custom_columns_table c
         JOIN   list_table l ON l.id = c.list_id
         ORDER  BY 1',

        'SELECT DISTINCT column_name
         FROM   custom_columns_table
         ORDER  BY 1')
AS tbl (
    id integer
   ,email text
   ,name text
   );

J'utilise la forme de crosstab() avec deux paramètres, car cela permet des attributs manquants. Comme, quand une personne n'a pas d'e-mail. Ensuite, ce formulaire renverra NULL pour le email colonne. Explication détaillée :

  • Requête croisée PostgreSQL

Fonction

Ou créez une fonction pour ne pas avoir à fournir une liste de définition de colonne pour chaque appel :

CREATE OR REPLACE FUNCTION f_mycross(text, text)
  RETURNS TABLE (
    id integer
   ,email text
   ,name text)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Appel :

SELECT * FROM f_mycross(
       'SELECT l.id
              ,c.column_name
              ,c.data
        FROM   custom_columns_table c
        JOIN   list_table l ON l.id = c.list_id
        ORDER  BY 1',
    
       'SELECT DISTINCT column_name
        FROM   custom_columns_table
        ORDER  BY 1')