2012-11-08 11 views
13

संभव डुप्लिकेट:
Postgres Dynamic Query FunctionPostgreSQL - तालिका नाम के रूप में एक गतिशील मान

मैं अन्य प्रश्न के लिए एक मेज नाम के रूप में नीचे दिए गए क्वेरी से लौटे स्ट्रिंग का उपयोग करना चाहते हैं।

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd') 

जैसा कि आप इसे एक स्ट्रिंग वापस देख सकते हैं। मैं इसे किसी अन्य क्वेरी के लिए इनपुट के रूप में उपयोग करना चाहता हूं, उदा।

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup 

क्या यह किया जा सकता है? कोई सुराग कैसे?

+0

मेरे पास ऐसा समाधान है जो http://stackoverflow.com/questions/10639963/postgres-dynamic-query- कार्यक्षमता को लागू नहीं करता है लेकिन इस समस्या के लिए दिलचस्प: चुनें '' बैकअप_ '|| TO_CHAR (CURRENT_DATE,' yyyy-mm -dd ') ||' '' AS tname; \ gset तालिका बनाएं: बैकअप के रूप में नाम चुनें * बैकअप से; –

उत्तर

27

आप PL/PgSQL EXECUTE statement उपयोग करने के लिए, एक DO ब्लॉक या PL/pgSQL समारोह (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql) के माध्यम से की आवश्यकता होगी। डायनामिक एसक्यूएल पोस्टग्रेएसक्यूएल द्वारा उपयोग की जाने वाली सामान्य एसक्यूएल बोली में समर्थित नहीं है, केवल प्रक्रियात्मक पीएल/पीजीएसक्यूएल संस्करण में।

DO 
$$ 
BEGIN 
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd')); 
END; 
$$ LANGUAGE plpgsql; 

format(...) function के %I और %L प्रारूप-विनिर्देशक उचित पहचानकर्ता और शाब्दिक के हवाले से क्रमश: करते हैं।

शाब्दिक मैं EXECUTE ... USING बजाय %L साथ format(...), का उपयोग करना चाहिये लिए लेकिन तालिका/स्तंभ नाम प्रारूप %I पैटर्न की तरह पहचानकर्ता के लिए quote_ident कॉल वर्बोस के लिए एक अच्छा संक्षिप्त विकल्प नहीं है।

+1

क्या नाम विशेष रूप से उद्धृत किए जाएंगे यदि इसमें विशेष वर्ण हैं? मैं वास्तव में एक PostgreSQL उपयोगकर्ता नहीं हूं, लेकिन यह संदिग्ध लगता है कि एक साधारण FORMAT() फ़ंक्शन ऐसा करने के लिए पर्याप्त चालाक होगा। –

+2

@AndriyM '' i 'इंटरपोलेशन प्लेसहोल्डर ['प्रारूप()'] (http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER) फ़ंक्शन में है विशेष रूप से पोस्टग्रेर्स पहचानकर्ताओं के लिए और आपूर्ति मूल्य को सुरक्षित रूप से उद्धृत करेंगे। – dbenhur

+0

@ डेबेंहूर: ओह, अच्छा, धन्यवाद। अच्छा समाधान तो क्रेग! (जाहिरा तौर पर :) –

संबंधित मुद्दे