Potřebujete dynamické SQL to znamená, že musíte vytvořit funkci nebo spustit DO
příkaz. Protože nemůžete vracet hodnoty přímo z posledně jmenovaného, funkce plpgsql je to:
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$;
Volejte:
SELECT * FROM f_count_all('myschema.mytable');
Vrátí:
columns | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}
Další vysvětlení a odkazy o dynamickém SQL a EXECUTE
v této související otázce - nebo několik dalších zde na SO, zkuste toto vyhledávání.
Velmi podobné této otázce:
postgresql - počet (žádné hodnoty null) každého sloupce v tabulce
Můžete dokonce zkusit vrátit polymorfní typ záznamu, abyste získali jednotlivé sloupce dynamicky, ale to je poměrně složité a pokročilé. Pravděpodobně příliš mnoho úsilí pro váš případ. Více v této související odpovědi.