動的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-テーブルの各列のカウント(null値なし)
多態的なレコードタイプを返して単一の列を動的に取得することもできますが、それはかなり複雑で高度です。おそらくあなたのケースにはあまりにも多くの努力が必要です。この関連する回答の詳細。