Anda memerlukan SQL dinamis untuk itu, yang berarti Anda harus membuat fungsi atau menjalankan DO
memerintah. Karena Anda tidak dapat mengembalikan nilai secara langsung dari yang terakhir, fungsi plpgsql itu:
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$;
Telepon:
SELECT * FROM f_count_all('myschema.mytable');
Pengembalian:
columns | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}
Penjelasan lebih lanjut dan tautan tentang SQL dinamis dan EXECUTE
dalam pertanyaan terkait ini - atau beberapa lagi di sini di SO, coba penelusuran ini.
Sangat mirip dengan pertanyaan ini:
postgresql - hitung (tidak ada nilai nol) setiap kolom dalam tabel
Anda bahkan dapat mencoba dan mengembalikan tipe rekaman polimorfik untuk mendapatkan kolom tunggal secara dinamis, tetapi itu agak rumit dan canggih. Mungkin terlalu banyak usaha untuk kasus Anda. Selengkapnya di jawaban terkait ini.