AS
को न छोड़ें स्तंभ उपनामों के लिए कुंजी शब्द
बिल्कुल नहीं। यह उड़ जाता है क्योंकि आपने AS
. कीवर्ड छोड़ दिया है जहां इसे छोड़ा नहीं जाना चाहिए।
यह काम करता है:
SELECT 'select '
|| string_agg(
case when udt_name in ('varchar', 'text')
then 'left(' || quote_ident(column_name) || ', 65535) AS ' -- !!
|| quote_ident(column_name)
else quote_ident(column_name)
end, ', ' order by ordinal_position)
|| ' from "public"."MyTableName"'
FROM information_schema.columns c
join parse_ident('"public"."MyTableName"') t
on t[1] = table_schema and t[2] = table_name;
उत्पादन:
SELECT id, left(first, 65535) AS first from "public"."MyTableName";
जो बदले में उम्मीद के मुताबिक काम करता है।
मैनुअल के बारे में "छोड़ना कुंजी शब्द के रूप में" :
कीवर्ड AS
. को छोड़ना ठीक है तालिका उपनामों के लिए, लेकिन स्तंभ उपनामों के लिए नहीं।
first
आरक्षित शब्द
नहीं है पोस्टग्रेज में। (यह प्राचीन SQL मानक SQL-92 में "आरक्षित" हुआ करता था, लेकिन मानक SQL में भी नहीं।) यह "गैर-आरक्षित" है * सटीक होना। मैनुअल
:
AS
को छोड़ना इसे सिर्फ एक ऐसा संदर्भ बनाता है।
quote_ident()
मज़बूती से काम करता है। मैनुअल:
format()
विनिर्देशक के साथ %I
वही करता है।
आरक्षित शब्दों का उल्लेख नहीं किया गया है, लेकिन परवाह किए बिना ठीक से उद्धृत किया गया है। सटीक होने के लिए:"आरक्षित" . के रूप में चिह्नित सभी प्रमुख शब्द या "(फ़ंक्शन या प्रकार नहीं हो सकता)" के कॉलम "PostgreSQL" में SQL कुंजी शब्द टेबल ।
मैं इसे जोड़ने के लिए एक दस्तावेज़ीकरण बग दर्ज करूंगा।
पूरी तरह से सुनिश्चित होने के लिए:quote_all_identifiers
यदि आप पूरी तरह से सुनिश्चित होना चाहते हैं और सभी अतिरिक्त शोर पर ध्यान नहीं देना चाहते हैं, तो आप पोस्टग्रेज को सभी को उद्धृत करने के लिए बाध्य कर सकते हैं। कॉन्फ़िगरेशन पैरामीटर के साथ पहचानकर्ता quote_all_identifiers
. मैनुअल:
इसमें quote_ident()
. से आउटपुट शामिल है और format()
. मैं नहीं would होता ऐसा करें, सभी अतिरिक्त शोर से डरते हुए।
आप SET LOCAL
. के साथ स्थानीय रूप से पैरामीटर सेट कर सकते हैं उसी लेनदेन में। पसंद:
BEGIN;
SET LOCAL quote_all_identifiers = true;
SELECT ...
END;
तेज़
उस ने कहा, मैं format()
. का उपयोग करूंगा और concat()
और कैटलॉग तालिका को लक्षित करें pg_attribute
इसके बजाय:क्लीनर, सरल, तेज। लेकिन अन्य RDBMS के लिए पोर्टेबल नहीं:
SELECT format('SELECT %s FROM %s;'
, string_agg(CASE WHEN atttypid = ANY ('{text, bpchar, varchar}'::regtype[])
THEN concat('left(', col, ', 65535) AS ', col)
ELSE col END, ', ')
, attrelid)
FROM (
SELECT attrelid::regclass, atttypid, quote_ident(attname) AS col
FROM pg_catalog.pg_attribute
WHERE attrelid = 'public."MyTableName"'::regclass -- provide once, optionally schema-qualified
AND attnum > 0
AND NOT attisdropped
ORDER BY attnum
) sub
GROUP BY attrelid;
उत्पादन:
SELECT id, left(first, 65535) AS first FROM "MyTableName";
db<>fiddle यहां
विशेष रूप से,...
- ... आपको टेबल का नाम केवल एक बार देना होगा, वैकल्पिक रूप से स्कीमा-योग्य।
- ... यदि तालिका मौजूद नहीं है, तो एक उपयोगी त्रुटि संदेश के साथ क्वेरी तुरंत विफल हो जाती है।
- ... आउटपुट तालिका का नाम केवल स्कीमा-योग्य और जहां आवश्यक हो, डबल-उद्धृत है।
- ... इसमें
character(N)
. भी शामिल है (आंतरिक नामbpchar
)।
आगे पढ़ना:
- यह कैसे जांचें कि किसी स्कीमा में कोई तालिका मौजूद है या नहीं
- पोस्टग्रेज psql चुनिंदा कथनों में डिफ़ॉल्ट रूप से प्रदर्शन को छोटा करना
- सभी डेटा के लिए PostgreSQL फ़ोर्स अपर केस
- जांचें कि कैरेक्टर-टाइप कॉलम में खाली स्ट्रिंग्स मौजूद हैं या नहीं