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

PostgreSQL række til kolonner

Først og fremmest crosstab() familie af funktioner er ikke installeret i standard PostgreSQL. Du skal installere udvidelsen tablefunc for det. I PostgreSQL 9.1 ville du blot:

CREATE EXTENSION tablefunc;

For ældre versioner, se dette relaterede svar.

Forespørgsel

Forespørgslen kunne se sådan ud:

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
   );

Jeg bruger formen crosstab() med to parametre, fordi det giver mulighed for manglende attributter. Som når en person ikke har nogen e-mail. Så vil denne formular returnere NULL for email kolonne. Detaljeret forklaring:

  • PostgreSQL krydstabulatorforespørgsel

Funktion

Eller opret en funktion, så du ikke behøver at levere en kolonnedefinitionsliste for hvert opkald:

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;

Ring til:

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



  1. MySQL indlæser NULL-værdier fra CSV-data

  2. Forbedre SQL Server-forespørgselsydeevne på store tabeller

  3. PostgreSQL:eksporter resulterende data fra SQL-forespørgsel til Excel/CSV

  4. Funktion til at beregne median i SQL Server