Можете да използвате предоставената функция C crosstab_hash
за това.
Ръководството не е много ясно в това отношение. Споменато е в края на главата за crosstab()
с два параметъра:
Можете да създадете предварително дефинирани функции, за да избегнете необходимостта да изписвате имена на колони и типове на резултатите във всяка заявка. Вижте примерите в предишния раздел. Основната функция C за тази форма на
crosstab
се наричаcrosstab_hash
.
За вашия пример:
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;
Обадете се:
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');
Имайте предвид, че трябва да създадете отделен crosstab_hash
функция за всяка crosstab
функция с различен тип връщане.
Свързано:
- PostgreSQL ред към колони
Вашата функция за генериране на списък с колони е доста объркан, резултатът е неправилен (int
липсва след kernel_id
), може да бъде заменен с тази SQL заявка:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
И така или иначе не може да се използва динамично.