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

पोस्टग्रेज psql सेलेक्ट स्टेटमेंट में डिफ़ॉल्ट रूप से डिस्प्ले को छोटा करना

psql के अंतर्निहित विकल्पों के साथ कोई रास्ता नहीं है जिसके बारे में मुझे पता होगा।
आप अपने लक्ष्य को @Drazen ने सुझाव दिया - बस बहुत आसान :

CREATE OR REPLACE FUNCTION f_trunc_columns(_tbl anyelement, _len int = 25)
  RETURNS SETOF anyelement AS
$func$
DECLARE
   _typ  CONSTANT regtype[] := '{bpchar, varchar}';  -- types to shorten
BEGIN
   RETURN QUERY EXECUTE (
   SELECT format('SELECT %s FROM %s'
               , string_agg(CASE WHEN a.atttypid = 'text'::regtype  -- simple case text
                              THEN format('left(%I, %s)', a.attname, _len)
                            WHEN a.atttypid = ANY(_typ)             -- other short types
                              THEN format('left(%I::text, %s)::%s'
                                 , a.attname, _len, format_type(a.atttypid, a.atttypmod))
                            ELSE quote_ident(a.attname) END         -- rest
                          , ', ' ORDER BY a.attnum)
               , pg_typeof(_tbl))
   FROM   pg_attribute a
   WHERE  a.attrelid = pg_typeof(_tbl)::text::regclass
   AND    NOT a.attisdropped  -- no dropped (dead) columns
   AND    a.attnum > 0        -- no system columns
   );
END
$func$  LANGUAGE plpgsql;

कॉल उदाहरण:

SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);

SQL Fiddle.

नोट

  • किसी भी . के लिए काम करता है कोई भी . के कॉलम वाली तालिका डेटा प्रकार।

  • यह फ़ॉर्म की क्वेरी बनाता और निष्पादित करता है:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • यह केवल चुने हुए डेटा प्रकारों के कॉलम को छोटा करता है और दूसरों को अकेला छोड़ देता है। मैंने बुनियादी चरित्र प्रकार शामिल किए:
    bpchar character . का आंतरिक नाम है और सभी प्रकार।
    varchar character varying . का आंतरिक नाम है और सभी प्रकार।
    अपनी आवश्यकताओं के अनुसार विस्तृत करें।

  • फ़ंक्शन सभी स्तंभों के लिए मूल स्तंभ नाम और डेटा प्रकार लौटाता है। मैंने text में छोटे कॉलम डाले हैं left() को खिलाने से पहले , जो text . लौटाता है , तो text कॉलम को किसी अन्य कलाकार की आवश्यकता नहीं है। अन्य सभी छोटे प्रकारों को मूल प्रकार पर वापस कास्ट करने की आवश्यकता होती है। यदि आप काट-छांट करते हैं तो कुछ प्रकार टूट जाते हैं! तो यह सभी प्रकार के लिए काम नहीं करता है।

  • आप LIMIT n append जोड़ सकते हैं फ़ंक्शन कॉल के लिए, लेकिन फ़ंक्शन को अंतर्निहित LIMIT . के साथ आसानी से बढ़ाया जा सकता है - जो बहुत है बड़ी तालिकाओं के लिए अधिक कुशल, क्योंकि plpgsql फ़ंक्शन के अंदर क्वेरी की योजना स्वतंत्र रूप से बनाई गई है।

  • प्रदर्शन एक सादे से ज्यादा खराब नहीं है SELECT * FROM tbl - उक्त LIMIT . को छोड़कर मामला या अन्य मामले जहां आप फ़ंक्शन को घोंसला बनाते हैं। सेट-रिटर्निंग पीएल/पीजीएसक्यूएल फ़ंक्शन आमतौर पर नेस्टेड नहीं होते हैं:

  • मैंने एक डिफ़ॉल्ट अधिकतम में बनाया है। 25 वर्णों की लंबाई, कस्टम लंबाई को दूसरे पैरामीटर के रूप में पास करें या फ़ंक्शन हेडर में डिफ़ॉल्ट को अपनी आवश्यकताओं के अनुसार अनुकूलित करें।

  • यह फ़ंक्शन दुर्भावनापूर्ण रूप से तैयार किए गए पहचानकर्ताओं के माध्यम से संभावित SQL इंजेक्शन हमलों से सुरक्षित है।

अधिक स्पष्टीकरण और लिंक के साथ संबंधित उत्तर:

pgव्यवस्थापक

... में वह सुविधा है जिसकी आप मांग कर रहे हैं, btw (सभी कॉलम के लिए):



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL में मिलान एल्गोरिथ्म

  2. SQL में किसी अन्य कॉलम के प्रत्येक मान के लिए सबसे सामान्य मान प्राप्त करें

  3. समूह में 'मध्य' मूल्यों का औसत कैसे प्राप्त करें?

  4. एन्कोडिंग से जुड़ी डेटाबेस कनेक्शन त्रुटि

  5. Ecto Fragments . का उपयोग करके टाइमस्टैम्प में अंतराल जोड़ें