2016-06-10 11 views
0

Ich habe eine Abfrage, die ich jeden Monat aktualisieren und eine neue Tabelle generieren muss. Es gibt mehrere Hinweise auf diese Tabelle, und ich vermisse sie immer. Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine lokale Variable zu setzen und sie durch die Abfrage wiederzuverwenden. Als ein Beispiel:Variable Referenz für PostgreSQL

DECLARE 'table'||to_char(curent_timestamp, 'MON') || 
       to_char(current_timestanp,"YY") AS table_ref; 
    CREATE TABLE table_ref AS select * FROM base_table; 
    SELECT * FROM table_ref; 

Danke.

+0

In welchem ​​Kontext wird dies verwendet? Wenn Sie nur den Inhalt haben wollten, könnten Sie einfach 'base_table' direkt abfragen, also nehme ich an, dass Sie versuchen, eine Kopie zu einem Zeitpunkt und" Zeitstempel "den Tabellennamen zu erstellen? Ist das korrekt? – Nicarus

+0

Totally - die Abfrage wäre komplexer als das. Ich ging einfach mit einem einfachen Basisbeispiel. – windsormatic

+0

Frage sollte geschlossen werden, da sie veraltet ist (siehe Kommentare zur Antwort unten) und OP eine neue Frage formulierte (http://stackoverflow.com/q/37752296/3304426). – Patrick

Antwort

0

können Sie verwenden FORMAT() und EXECUTE Ihre dynamische SQL auszuführen, etwa so:

DO $$ 

DECLARE table_name TEXT; 

BEGIN 

    SELECT FORMAT('table%I',TO_CHAR(CURRENT_TIMESTAMP,'MONYY')) INTO table_name; -- ex. tableJUN16 

    EXECUTE FORMAT('CREATE TABLE %I AS SELECT * FROM base_table;',table_name); 

END; $$ LANGUAGE PLPGSQL; 

Dies wird Ihre neue Tabelle aus den base_table mit dynamischen Namen erstellen.

https://www.postgresql.org/docs/current/static/functions-string.html

+0

Ich bin jetzt nicht an meinem Computer, aber ich möchte diese Tabelle mehrmals durch das Skript referenzieren. Ist das möglich? – windsormatic

+0

@windsormatic - Ja. Ich werde es aktualisieren, um besser zu passen. – Nicarus

+0

Verwenden Sie das% I-Substitutionssymbol in der Funktion 'format' für den SQL-Bezeichner. Es gewährleistet das korrekte Entweichen und Schutz gegen SQL-Injektion. –