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
heetcrosstab_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.