Możesz użyć dostarczonej funkcji C crosstab_hash
w tym celu.
Instrukcja nie jest pod tym względem bardzo jasna. Jest to wspomniane na końcu rozdziału o crosstab()
z dwoma parametrami:
Możesz tworzyć predefiniowane funkcje, aby uniknąć konieczności zapisywania nazw i typów kolumn wynikowych w każdym zapytaniu. Zobacz przykłady w poprzedniej sekcji. Podstawowa funkcja C dla tej postaci crosstab
ma nazwę crosstab_hash
.
Na przykład:
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;
Zadzwoń:
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');
Pamiętaj, że musisz utworzyć odrębny crosstab_hash
funkcja dla każdej crosstab
funkcja z innym typem zwracania.
Powiązane:
- PostgreSQL wiersz do kolumn
Twoja funkcja generowania listy kolumn jest raczej zawiły, wynik jest niepoprawny (int
brakuje po kernel_id
), można go zastąpić następującym zapytaniem SQL:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
I tak nie można go używać dynamicznie.