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

दी गई तालिका के लिए स्तंभों के गतिशील सेट को वापस करने का कार्य

साधारण मामले का समाधान

जैसा कि नीचे दिए गए संदर्भित उत्तरों में बताया गया है, आप पंजीकृत (पंक्ति) प्रकारों का उपयोग कर सकते हैं, और इस प्रकार एक बहुरूपी फ़ंक्शन के रिटर्न प्रकार को परोक्ष रूप से घोषित कर सकते हैं:

CREATE OR REPLACE FUNCTION public.get_table(_tbl_type anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('TABLE %s', pg_typeof(_tbl_type));
END
$func$ LANGUAGE plpgsql;

कॉल करें:

SELECT * FROM public.get_table(NULL::public.users);  -- note the syntax!

पूरी तालिका (सभी उपयोगकर्ता कॉलम के साथ) लौटाता है।

रुको! कैसे?

इस संबंधित उत्तर में विस्तृत विवरण, अध्याय"विभिन्न पूर्ण तालिका प्रकार" :

  • एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके

TABLE foo SELECT * FROM foo के लिए संक्षिप्त है :

  • क्या SELECT * FROM का कोई शॉर्टकट है?

2 पूरी तरह से गतिशील वापसी प्रकार के लिए कदम

लेकिन आप जो करने की कोशिश कर रहे हैं वह है सख्ती से असंभव एक एकल . में एसक्यूएल कमांड।

<ब्लॉकक्वॉट>

मैं schema_name पास करना चाहता हूं और table_name column_visible . के अनुसार कार्य करने और रिकॉर्ड सूची प्राप्त करने के लिए पैरामीटर के रूप में public.fields . में फ़ील्ड टेबल.

किसी फ़ंक्शन से - या कोई कॉलम के मनमाने ढंग से चयन (कॉल समय पर ज्ञात नहीं रिटर्न प्रकार) को वापस करने का कोई सीधा तरीका नहीं है एसक्यूएल कमांड। SQL कॉल के समय परिणामी कॉलम की संख्या, नाम और प्रकार जानने की मांग करता है। इस संबंधित उत्तर के दूसरे अध्याय में और अधिक:

  • मैं पिवोटेड क्रॉस जॉइन कैसे उत्पन्न करूं जहां परिणामी तालिका परिभाषा अज्ञात है?

विभिन्न समाधान . हैं . आप परिणाम को मानक दस्तावेज़ प्रकारों में से एक में लपेट सकते हैं (json , jsonb , hstore , xml )।

या आप एक फ़ंक्शन कॉल के साथ क्वेरी जेनरेट करते हैं और अगले के साथ परिणाम निष्पादित करते हैं:

CREATE OR REPLACE FUNCTION public.generate_get_table(_schema_name text, _table_name text)
  RETURNS text AS
$func$
   SELECT format('SELECT %s FROM %I.%I'
               , string_agg(quote_ident(column_name), ', ')
               , schema_name
               , table_name)
   FROM   fields
   WHERE  column_visible
   AND    schema_name = _schema_name 
   AND    table_name  = _table_name
   GROUP  BY schema_name, table_name
   ORDER  BY schema_name, table_name;
$func$  LANGUAGE sql;

कॉल करें:

SELECT public.generate_get_table('public', 'users');

यह फ़ॉर्म की एक क्वेरी बनाता है:

SELECT usr_id, usr FROM public.users;

इसे दूसरे चरण में निष्पादित करें। (हो सकता है कि आप कॉलम नंबर और ऑर्डर कॉलम जोड़ना चाहें।)
या \gexec जोड़ें psql में तुरंत वापसी मूल्य निष्पादित करने के लिए। देखें:

विदेशी सर्वर में शामिल होने / नीचे धकेलने से पहले सबक्वायरी के मूल्यांकन को कैसे बाध्य करें

SQL इंजेक्शन से बचाव करना सुनिश्चित करें:

  • ट्रिगर फ़ंक्शन में गतिशील तालिका नाम के साथ INSERT
  • plpgsql फ़ंक्शन में तालिका और स्तंभ नामों को तर्क के रूप में परिभाषित करें?
असाइड्स

varchar(100) पहचानकर्ताओं के लिए ज्यादा मायने नहीं रखता है, जो मानक पोस्टग्रेज में 63 वर्णों तक सीमित हैं:

  • लेबल में अधिकतम वर्ण (तालिका नाम, कॉलम आदि)

यदि आप समझते हैं कि ऑब्जेक्ट आइडेंटिफ़ायर कैसे टाइप करता है regclass काम करता है, आप स्कीमा और तालिका के नाम को एक regclass . से बदल सकते हैं कॉलम।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टगिस इंस्टॉलेशन:टाइप ज्योमेट्री मौजूद नहीं है

  2. Postgres . का उपयोग करके एकाधिक स्कीमा से सभी रिकॉर्ड चुनें (पुनर्प्राप्त करें)

  3. Java Enums, JPA और Postgres enums - मैं उन्हें एक साथ कैसे काम करूँ?

  4. PostgreSQL में Arrays की तुलना कैसे करें

  5. Docker कंटेनर पर PostgreSQL डेटाबेस से कनेक्ट करें