2012-11-08 10 views
13

Mögliche Duplizieren:
Postgres Dynamic Query FunctionPostgreSQL - dynamischer Wert als Tabellenname

Ich wünsche den zurückgegebenen String aus der Abfrage unten als Tabellenname für andere Abfrage verwenden.

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

Wie Sie sehen, gibt es eine Zeichenfolge zurück. Ich möchte es als Eingabe für eine andere Abfrage verwenden, z.

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

Kann es getan werden? Irgendeine Ahnung wie?

+0

Ich habe eine Lösung, die http://stackoverflow.com/questions/10639963/postgres-dynamic-query-function nicht zutreffen, aber für dieses Problem interessant: SELECT '"backup_' || TO_CHAR (CURRENT_DATE, 'JJJJ-MM -dd ') ||' "'ASname; \ gset CREATE TABLE: tname AS SELECT * FROM Sicherung; –

Antwort

27

Sie müssen die PL/PgSQL EXECUTE statement verwenden, über einen DO Block oder PL/PgSQL Funktion (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql). Dynamic SQL wird nicht im normalen SQL-Dialekt von PostgreSQL unterstützt, sondern nur in der prozeduralen PL/PgSQL-Variante.

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

Die format(...) function ‚s %I und %L Format-Spezifizierer tun richtige Kennung und wörtliche zitiert sind.

Für Literale Ich empfehle EXECUTE ... USING statt format(...) mit %L verwenden, aber für Bezeichner wie Tabelle/Spaltennamen das Format %I Muster ist eine nette kurze alternative quote_ident Anrufe ausführlich.

+1

Wird der Name automatisch zitiert, wenn er Sonderzeichen enthält? Ich bin nicht wirklich ein PostgreSQL-Benutzer, aber es scheint zweifelhaft, dass eine einfache FORMAT() - Funktion clever genug wäre, um das zu tun. –

+2

@AndriyM Der '% I'-Interpolationsplatzhalter in der Funktion' 'format()'] (http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER) ist speziell für Postgres Bezeichner und wird den angegebenen Wert sicher angeben. – dbenhur

+0

@dbenhur: Oh, gut, danke. Nette Lösung dann, Craig! (anscheinend :) –

Verwandte Themen