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);
नोट
-
किसी भी . के लिए काम करता है कोई भी . के कॉलम वाली तालिका डेटा प्रकार।
-
यह फ़ॉर्म की क्वेरी बनाता और निष्पादित करता है:
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 इंजेक्शन हमलों से सुरक्षित है।
अधिक स्पष्टीकरण और लिंक के साथ संबंधित उत्तर:
- खाली स्ट्रिंग्स को रिक्त मानों से बदलें
- एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके
- टेबल का नाम a के रूप में PostgreSQL फ़ंक्शन पैरामीटर
- डेटा टाइप कास्ट पोस्ट करें
- PostgreSQL में किसी तालिका के स्कीमा विवरण को क्वेरी करें?
- यह कैसे जांचें कि किसी स्कीमा में कोई तालिका मौजूद है या नहीं
pgव्यवस्थापक
... में वह सुविधा है जिसकी आप मांग कर रहे हैं, btw (सभी कॉलम के लिए):