sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL rij naar kolommen

Ten eerste, de crosstab() familie van functies is niet geïnstalleerd in standaard PostgreSQL. U moet de extensie tablefunc . installeren voor deze. In PostgreSQL 9.1 zou je simpelweg:

CREATE EXTENSION tablefunc;

Bekijk voor oudere versies dit gerelateerde antwoord.

Zoekopdracht

De zoekopdracht kan er als volgt uitzien:

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

Ik gebruik de vorm van crosstab() met twee parameters, want dat zorgt voor ontbrekende attributen. Zoals, wanneer een persoon geen e-mail heeft. Dan retourneert dit formulier NULL voor de email kolom. Gedetailleerde uitleg:

  • PostgreSQL-kruistabelquery

Functie

Of maak een functie aan zodat u niet voor elke aanroep een kolomdefinitielijst hoeft aan te leveren:

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;

Bel:

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. Beperkingen tijdelijk uitschakelen (MS SQL)

  2. Maak een gekoppelde server tussen twee Docker-containers met SQL Server (T-SQL-voorbeeld)

  3. Point-in-Time Recovery van MySQL- en MariaDB-gegevens uitvoeren met ClusterControl

  4. Hoe 'ON DELETE CASCADE' toe te voegen in de ALTER TABLE-instructie