Potrzebujesz dynamicznego SQL w tym celu, co oznacza, że musisz utworzyć funkcję lub uruchomić DO
Komenda. Ponieważ nie możesz zwrócić wartości bezpośrednio z tego ostatniego, funkcja plpgsql to jest:
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$;
Zadzwoń:
SELECT * FROM f_count_all('myschema.mytable');
Zwroty:
columns | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}
Więcej wyjaśnień i linków na temat dynamicznego SQL i EXECUTE
w tym powiązanym pytaniu - lub kilka innych tutaj na SO, wypróbuj tę wyszukiwarkę.
Bardzo podobne do tego pytania:
postgresql - liczba (bez wartości pustych) każdej kolumny w tabeli
Możesz nawet spróbować zwrócić polimorficzny typ rekordu, aby dynamicznie uzyskać pojedyncze kolumny, ale jest to dość złożone i zaawansowane. Prawdopodobnie za dużo wysiłku dla twojej sprawy. Więcej w tej powiązanej odpowiedzi.