PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

किसी तालिका से स्तंभों का एक गतिशील सेट चुनें और प्रत्येक के लिए योग प्राप्त करें

यह क्वेरी आपके लिए पूरा 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 के साथ सरल उदाहरण दिया गया है




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अनुरोध से PostgreSQL दिनांक भाषा बदलें

  2. Atomikos:PostgreSQL का उपयोग करते समय डेटा सहेजा नहीं जा रहा है

  3. to_tsquery . में विशेष वर्णों से बचना

  4. सक्रिय रिकॉर्ड का उपयोग करके एक नेस्टेड/बहु-स्तरीय पोस्टग्रेज JSON प्रकार पर खोजें

  5. psycopg2 + pgbouncer. gevent त्रुटि के साथ Async मोड