Trước hết, crosstab()
họ hàm không được cài đặt trong PostgreSQL tiêu chuẩn. Bạn cần cài đặt tiện ích mở rộng tablefunc
cho điều này. Trong PostgreSQL 9.1, bạn chỉ cần:
CREATE EXTENSION tablefunc;
Đối với các phiên bản cũ hơn, hãy xem câu trả lời liên quan này.
Truy vấn
Truy vấn có thể trông như thế này:
SELECT *
FROM crosstab (
'SELECT l.id
,c.column_name
,c.data
FROM custom_columns_table c
JOIN list_table l ON l.id = c.list_id
ORDER BY 1',
'SELECT DISTINCT column_name
FROM custom_columns_table
ORDER BY 1')
AS tbl (
id integer
,email text
,name text
);
Tôi sử dụng dạng crosstab()
với hai tham số, vì điều đó cho phép thiếu các thuộc tính. Giống như, khi một người không có email. Sau đó, biểu mẫu này sẽ trả về NULL
cho email
cột. Giải thích chi tiết:
- Truy vấn bảng chéo PostgreSQL
Chức năng
Hoặc tạo một hàm để bạn không phải cung cấp danh sách định nghĩa cột cho mọi lệnh gọi:
CREATE OR REPLACE FUNCTION f_mycross(text, text)
RETURNS TABLE (
id integer
,email text
,name text)
AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
Gọi:
SELECT * FROM f_mycross(
'SELECT l.id
,c.column_name
,c.data
FROM custom_columns_table c
JOIN list_table l ON l.id = c.list_id
ORDER BY 1',
'SELECT DISTINCT column_name
FROM custom_columns_table
ORDER BY 1')