Нуждаете се от динамичен SQL за това, което означава, че трябва да създадете функция или да изпълните DO
команда. Тъй като не можете да върнете стойности директно от последния, функция plpgsql това е:
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$;
Обадете се:
SELECT * FROM f_count_all('myschema.mytable');
Връща:
columns | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}
Още обяснения и връзки за динамичния SQL и EXECUTE
в този свързан въпрос - или още няколко тук на SO, опитайте това търсене.
Много подобно на този въпрос:
postgresql - брой (без нулеви стойности) на всяка колона в таблица
Можете дори да опитате да върнете полиморфен тип запис, за да получите единични колони динамично, но това е доста сложно и напреднало. Вероятно твърде много усилия за вашия случай. Повече в този свързан отговор.