sql >> Database >  >> RDS >> PostgreSQL

Dynamisch kolommen genereren voor kruistabel in PostgreSQL

U kunt de meegeleverde C-functie crosstab_hash . gebruiken hiervoor.

De handleiding is op dit punt niet erg duidelijk. Het wordt vermeld aan het einde van het hoofdstuk over crosstab() met twee parameters:

U kunt vooraf gedefinieerde functies maken om te voorkomen dat u de kolomnamen en typen van de resultaten in elke query moet wegschrijven. Zie de voorbeelden in de vorige paragraaf. De onderliggende C-functie voor deze vorm van crosstab heet crosstab_hash .

Voor jouw voorbeeld:

CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
  RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Bel:

SELECT * FROM f_cross_test_db(
      'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
     ,'SELECT DISTINCT key FROM test_db ORDER BY 1');

Merk op dat u een aparte crosstab_hash . moet maken functie voor elke crosstab functie met een ander retourtype.

Gerelateerd:

  • PostgreSQL rij naar kolommen

Uw functie om de kolomlijst te genereren is nogal ingewikkeld, het resultaat is onjuist (int ontbreekt na kernel_id ), kan het worden vervangen door deze SQL-query:

SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

En het kan sowieso niet dynamisch worden gebruikt.



  1. Pictogrammen voor SQL-ontwikkelaars

  2. Het uitvoeringsplan voor query's bekijken in Azure Data Studio (SQL Server)

  3. Waarschuwing:mysqli_query() verwacht dat parameter 1 mysqli is, resource gegeven

  4. Oracle 11g krijgt alle overeenkomende voorvallen door een reguliere expressie