2012-11-08 31 views
13

Eventuali duplicati:
Postgres Dynamic Query FunctionPostgreSQL - valore dinamico come nome della tabella

desidero utilizzare la stringa restituita dalla query sotto come un nome di tabella per altra query.

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

come si può vedere restituire una stringa. Vorrei usarlo come input per un'altra query, ad es.

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

Si può fare? Qualche idea su come?

+0

Ho una soluzione che non si applica http://stackoverflow.com/questions/10639963/postgres-dynamic-query-function ma interessante per questo problema: SELECT '"backup_' || TO_CHAR (CURRENT_DATE, 'aaaa-mm -dd ') ||' "'AS tname; \ gset CREATE TABLE: tname AS SELECT * FROM backup; –

risposta

27

È necessario utilizzare PL/PgSQL EXECUTE statement, tramite un blocco DO o una funzione PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql). Dynamic SQL non è supportato nel comune dialetto SQL utilizzato da PostgreSQL, solo nella variante procedurale PL/PgSQL.

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

s' The format(...) function%I e %L formato-prescrittori fare una corretta identificazione e letterale citando rispettivamente.

Per letterali mi consiglia di utilizzare EXECUTE ... USING piuttosto che format(...) con %L, ma per gli identificatori come tavolo/nomi delle colonne del modello di formato %I è una bella alternativa conciso a verbose quote_ident chiamate.

+1

Il nome verrà automaticamente citato se contiene caratteri speciali? Non sono un utente di PostgreSQL, ma mi sembra dubbio che una semplice funzione FORMAT() sia abbastanza intelligente per farlo. –

+2

@AndriyM Il segnaposto di interpolazione '% I' nella funzione [' format() '] (http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER) è specificamente per gli identificatori postgres e citerà in modo sicuro il valore fornito. – dbenhur

+0

@dbenhur: Oh, bene, grazie. Bella soluzione allora, Craig! (apparentemente :) –