Bạn cần SQL động cho điều đó, có nghĩa là bạn phải tạo một hàm hoặc chạy một DO
yêu cầu. Vì bạn không thể trả về các giá trị trực tiếp từ giá trị sau, một hàm plpgsql nó là:
CREATE OR REPLACE function f_count_all(_tbl text
, OUT columns text[], OUT counts bigint[])
RETURNS record LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE (
SELECT 'SELECT
ARRAY[' || string_agg('''' || quote_ident(attname) || '''', ', ') || '],
ARRAY[' || string_agg('count(' || quote_ident(attname) || ')', ', ') || ']
FROM ' || _tbl
FROM pg_attribute
WHERE attrelid = _tbl::regclass
AND attnum >= 1 -- exclude tableoid & friends (neg. attnum)
AND attisdropped is FALSE -- exclude deleted columns
GROUP BY attrelid
)
INTO columns, counts;
END
$func$;
Gọi:
SELECT * FROM f_count_all('myschema.mytable');
Lợi nhuận:
Các cộtcolumns | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}
Giải thích thêm và các liên kết về SQL động và EXECUTE
trong câu hỏi liên quan này - hoặc một vài câu hỏi khác ở đây trên SO, hãy thử serach này.
Rất giống với câu hỏi này:
postgresql - số lượng (không có giá trị rỗng) của mỗi cột trong bảng
Bạn thậm chí có thể thử và trả về một loại bản ghi đa hình để nhận động các cột đơn lẻ, nhưng điều đó khá phức tạp và nâng cao. Có lẽ là quá nhiều nỗ lực cho trường hợp của bạn. Thêm trong câu trả lời liên quan này.