यह क्वेरी आपके लिए पूरा DML स्टेटमेंट बनाती है:
WITH x AS (
SELECT 'public'::text AS _schema -- provide schema name ..
,'somereport'::text AS _tbl -- .. and table name once
)
SELECT 'SELECT ' || string_agg('sum(' || quote_ident(column_name)
|| ') AS sum_' || quote_ident(column_name), ', ')
|| E'\nFROM ' || quote_ident(x._schema) || '.' || quote_ident(x._tbl)
FROM x, information_schema.columns
WHERE table_schema = _schema
AND table_name = _tbl
AND data_type = 'integer'
GROUP BY x._schema, x._tbl;
आप इसे अलग से निष्पादित कर सकते हैं या इस क्वेरी को plpgsql फ़ंक्शन में लपेट सकते हैं और क्वेरी को EXECUTE
के साथ स्वचालित रूप से चला सकते हैं :
पूर्ण स्वचालन
PostgreSQL 9.1.4 के साथ परीक्षण किया गया
CREATE OR REPLACE FUNCTION f_get_sums(_schema text, _tbl text)
RETURNS TABLE(names text[], sums bigint[]) AS
$BODY$
BEGIN
RETURN QUERY EXECUTE (
SELECT 'SELECT ''{'
|| string_agg(quote_ident(c.column_name), ', ' ORDER BY c.column_name)
|| '}''::text[],
ARRAY['
|| string_agg('sum(' || quote_ident(c.column_name) || ')'
, ', ' ORDER BY c.column_name)
|| ']
FROM '
|| quote_ident(_schema) || '.' || quote_ident(_tbl)
FROM information_schema.columns c
WHERE table_schema = _schema
AND table_name = _tbl
AND data_type = 'integer'
);
END;
$BODY$
LANGUAGE plpgsql;
कॉल करें:
SELECT unnest(names) AS name, unnest (sums) AS col_sum
FROM f_get_sums('public', 'somereport');
रिटर्न:
name | col_sum
---------------+---------
int_col1 | 6614
other_int_col | 8364
third_int_col | 2720642
व्याख्या करें
कठिनाई RETURN
. को परिभाषित करना है फ़ंक्शन के लिए टाइप करें, जबकि लौटाए गए कॉलम की संख्या और नाम अलग-अलग होंगे। एक विवरण जो थोड़ी मदद करता है:आप केवल integer
चाहते हैं कॉलम।
मैंने इसे bigint
. की एक सरणी बनाकर हल किया (sum(int_col)
रिटर्न bigint
) इसके अलावा मैं कॉलम नामों की एक सरणी लौटाता हूं। दोनों कॉलम नाम के अनुसार वर्णानुक्रम में क्रमबद्ध हैं।
फ़ंक्शन कॉल में मैंने इन सरणियों को unnest()
प्रदर्शित सुंदर प्रारूप पर पहुंचना।
गतिशील रूप से बनाई गई और निष्पादित क्वेरी उन्नत सामग्री है। उद्धरणों की कई परतों से भ्रमित न हों। मूल रूप से आपके पास EXECUTE
. है जो निष्पादित करने के लिए SQL क्वेरी युक्त एक टेक्स्ट तर्क लेता है। यह पाठ, बदले में, द्वितीयक SQL क्वेरी द्वारा प्रदान किया जाता है जो प्राथमिक क्वेरी की क्वेरी स्ट्रिंग बनाता है।
अगर यह एक बार में बहुत अधिक है या plpgsql
आपके लिए नया है, इस संबंधित उत्तर
से प्रारंभ करें जहां मैं एक बहुत ही सरल कार्य से संबंधित मूल बातें समझाता हूं और प्रमुख विशेषताओं के लिए मैनुअल के लिंक प्रदान करता हूं।
अगर प्रदर्शन पोस्टग्रेस कैटलॉग को सीधे क्वेरी करना आवश्यक है (pg_catalog.pg_attributes
) मानकीकृत (लेकिन धीमी) का उपयोग करने के बजाय information_schema.columns
. यहां एक pg_attributes
के साथ सरल उदाहरण दिया गया है
।