PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Linha do PostgreSQL para colunas


Primeiro, o crosstab() família de funções não está instalada no PostgreSQL padrão. Você precisa instalar a extensão tablefunc por esta. No PostgreSQL 9.1 você simplesmente:
CREATE EXTENSION tablefunc;

Para versões mais antigas, dê uma olhada nesta resposta relacionada.

Consulta


A consulta poderia ficar assim:
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
   );

Eu uso a forma de crosstab() com dois parâmetros, porque isso permite atributos ausentes. Tipo, quando uma pessoa não tem e-mail. Então este formulário retornará NULL para o email coluna. Explicação detalhada:
  • Consulta de tabela cruzada PostgreSQL

Função


Ou crie uma função para não precisar fornecer uma lista de definição de coluna para cada chamada:
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;

Ligar:
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')