Bạn có thể sử dụng hàm C được cung cấp crosstab_hash
cho điều này.
Hướng dẫn sử dụng không rõ ràng lắm về mặt này. Nó được đề cập ở cuối chương về crosstab()
với hai tham số:
Bạn có thể tạo các hàm được xác định trước để tránh phải viết ra các tên và loại cột kết quả trong mỗi truy vấn. Xem các ví dụ trong phần trước. Hàm C cơ bản cho dạng
crosstab
này được đặt tên làcrosstab_hash
.
Ví dụ của bạn:
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;
Gọi:
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');
Lưu ý rằng bạn cần tạo một crosstab_hash
riêng biệt chức năng cho mọi crosstab
với một kiểu trả về khác.
Có liên quan:
- PostgreSQL hàng thành cột
Chức năng tạo danh sách cột của bạn khá phức tạp, kết quả không chính xác (int
thiếu sau kernel_id
), nó có thể được thay thế bằng truy vấn SQL này:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
Và nó vẫn không thể được sử dụng động.