Você pode usar a função C fornecida
crosstab_hash
por esta. O manual não é muito claro a esse respeito. É mencionado no final do capítulo sobre
crosstab()
com dois parâmetros:
Você pode criar funções predefinidas para evitar ter que escrever os nomes e tipos de coluna de resultado em cada consulta. Veja os exemplos na seção anterior. A função C subjacente para esta forma decrosstab
chama-secrosstab_hash
.
Para o seu exemplo:
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;
Ligar:
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');
Observe que você precisa criar um
crosstab_hash
distinto função para cada crosstab
função com um tipo de retorno diferente. Relacionado:
- Linha para colunas do PostgreSQL
Sua função para gerar a lista de colunas é bastante complicado, o resultado está incorreto (
int
ausente após kernel_id
), ele pode ser substituído por esta consulta SQL:SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
E não pode ser usado dinamicamente de qualquer maneira.