Du kan bruge den medfølgende C-funktion crosstab_hash
for dette.
Manualen er ikke særlig klar i denne henseende. Det er nævnt i slutningen af kapitlet om crosstab()
med to parametre:
Du kan oprette foruddefinerede funktioner for at undgå at skulle skrive resultatkolonnenavne og -typer ud i hver forespørgsel. Se eksemplerne i forrige afsnit. Den underliggende C-funktion for denne form for crosstab
hedder crosstab_hash
.
For dit eksempel:
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;
Ring til:
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');
Bemærk, at du skal oprette en særskilt crosstab_hash
funktion for hver crosstab
funktion med en anden returtype.
Relateret:
- PostgreSQL række til kolonner
Din funktion til at generere kolonnelisten er temmelig indviklet, resultatet er forkert (int
mangler efter kernel_id
), kan den erstattes med denne SQL-forespørgsel:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
Og det kan alligevel ikke bruges dynamisk.