Anda dapat menggunakan fungsi C yang disediakan crosstab_hash
untuk ini.
Manual tidak terlalu jelas dalam hal ini. Disebutkan di akhir bab tentang crosstab()
dengan dua parameter:
Anda dapat membuat fungsi yang telah ditentukan sebelumnya untuk menghindari keharusan menulis nama dan jenis kolom hasil di setiap kueri. Lihat contoh di bagian sebelumnya. Fungsi C yang mendasari untuk bentuk
crosstab
ini diberi namacrosstab_hash
.
Untuk contoh Anda:
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;
Telepon:
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');
Perhatikan bahwa Anda perlu membuat crosstab_hash
yang berbeda fungsi untuk setiap crosstab
fungsi dengan tipe pengembalian yang berbeda.
Terkait:
- PostgreSQL baris ke kolom
Anda berfungsi untuk menghasilkan daftar kolom agak berbelit-belit, hasilnya salah (int
hilang setelah kernel_id
), dapat diganti dengan kueri SQL ini:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
Dan itu tidak dapat digunakan secara dinamis.