提供されているC関数crosstab_hash
を使用できます このために。
マニュアルはこの点であまり明確ではありません。 crosstab()
の章の最後に記載されています 2つのパラメータを使用:
事前定義された関数を作成して、各クエリで結果の列名とタイプを書き出す必要をなくすことができます。前のセクションの例を参照してください。この形式の
crosstab
の基礎となるC関数 名前は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;
とにかく動的に使用することはできません。