Můžete použít poskytnutou C funkci crosstab_hash
za to.
Manuál není v tomto ohledu příliš přehledný. Je to zmíněno na konci kapitoly o crosstab()
se dvěma parametry:
Můžete vytvořit předdefinované funkce, abyste nemuseli vypisovat výsledné názvy a typy sloupců v každém dotazu. Viz příklady v předchozí části. Základní funkce C pro tuto formu
crosstab
se jmenujecrosstab_hash
.
Pro váš příklad:
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;
Volejte:
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');
Všimněte si, že musíte vytvořit samostatný crosstab_hash
funkce pro každý crosstab
funkce s jiným návratovým typem.
Související:
- PostgreSQL od řádků ke sloupcům
Vaše funkce generování seznamu sloupců je poněkud spletitý, výsledek je nesprávný (int
chybí za kernel_id
), lze jej nahradit tímto dotazem SQL:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
A stejně jej nelze používat dynamicky.