Динамически генерировать столбцы для кросс-таблицы в PostgreSQL

Я пытаюсь создатьcrosstab запросы в PostgreSQL, так что он автоматически генерируетcrosstab столбцы вместо жесткого кодирования. Я написал функцию, которая динамически генерирует список столбцов, который мне нужен для моегоcrosstab запрос. Идея состоит в том, чтобы заменить результат этой функции вcrosstab запрос с использованием динамического SQL.

Я знаю, как это легко сделать в SQL Server, но мои ограниченные знания PostgreSQL мешают мне в этом. Я думал о том, чтобы сохранить результат функции, которая генерирует динамический список столбцов, в переменную и использовать ее для динамического построения SQL-запроса. Было бы замечательно, если бы кто-то мог направить меня относительно того же самого.


-- Table which has be pivoted
CREATE TABLE test_db
(
    kernel_id int,
    key int,
    value int
);

INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);


-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
    key_id int;
    text_op TEXT = '' kernel_id int, '';
BEGIN
    FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP
    text_op := text_op || key_id || '' int , '' ;
    END LOOP;
    text_op := text_op || '' DUMMY text'';
    RETURN text_op;
END;
' LANGUAGE 'plpgsql';

-- This query works. I just need to convert the static list
-- of crosstab columns to be generated dynamically.
SELECT * FROM
crosstab
(
    'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2',
    'SELECT DISTINCT key FROM test_db ORDER BY 1'
)
AS x (kernel_id int, key1 int, key2 int, key3 int); -- How can I replace ..
-- .. this static list with a dynamically generated list of columns ?

Ответы на вопрос(4)

Ваш ответ на вопрос