आपको डायनामिक 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 - किसी तालिका में प्रत्येक स्तंभ की गणना (कोई शून्य मान नहीं)
आप एकल कॉलम को गतिशील रूप से प्राप्त करने के लिए पॉलिमॉर्फिक रिकॉर्ड प्रकार को भी आजमा सकते हैं और वापस कर सकते हैं, लेकिन यह जटिल और उन्नत है। शायद आपके मामले के लिए बहुत अधिक प्रयास। इस संबंधित उत्तर में और अधिक।