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

कॉलम सूचीबद्ध किए बिना, प्रत्येक कॉलम पर समान एकत्रीकरण कैसे करें?

आपको डायनामिक 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 - किसी तालिका में प्रत्येक स्तंभ की गणना (कोई शून्य मान नहीं)

आप एकल कॉलम को गतिशील रूप से प्राप्त करने के लिए पॉलिमॉर्फिक रिकॉर्ड प्रकार को भी आजमा सकते हैं और वापस कर सकते हैं, लेकिन यह जटिल और उन्नत है। शायद आपके मामले के लिए बहुत अधिक प्रयास। इस संबंधित उत्तर में और अधिक।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NULL मानों के साथ NOT LIKE का व्यवहार

  2. रेल ऐप में हेरोकू पोस्टग्रेएसक्यूएल GROUP_BY त्रुटि

  3. PostgreSQL में अपरकेस वर्णों वाली पंक्तियों को खोजने के 4 तरीके

  4. समवर्ती पहुंच पर तालिका में पंक्तियों के कुछ एनआर को कैसे चिह्नित करें?

  5. पीएल/पीजीएसक्यूएल फ़ंक्शन में चयन करें या निष्पादित करें