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

उद्धरण_पहचान () पहले कॉलम नाम में उद्धरण नहीं जोड़ता है

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 )।

आगे पढ़ना:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django.contrib.gis.measure.D का उपयोग करते समय GeoDjango त्रुटियों के भीतर

  2. उद्धरण_पहचान () पहले कॉलम नाम में उद्धरण नहीं जोड़ता है

  3. Postgresql, मामले के आधार पर अद्यतन या सम्मिलित करें

  4. PostgreSQL के लिए क्लाउड डेटाबेस विकल्पों की तुलना करना

  5. पोस्टग्रेज - दो सरणियों की तुलना करना