2012-11-08 65 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-function但這個問題有趣:SELECT'「backup_'|| TO_CHAR(CURRENT_DATE,'yyyy-mm -dd')||'「'AS tname; \ gset CREATE TABLE:tname AS SELECT * FROM backup; –

回答

27

您將需要使用PL/PgSQL EXECUTE statement,通過DO塊或PL/PgSQL功能(CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql)。動態SQL在PostgreSQL使用的普通SQL方言中不受支持,只能在程序化PL/PgSQL變體中使用。

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而不是format(...)%L,文字但如表/列名的格式%I模式標識符是一個不錯的簡潔替代長篇大論quote_ident電話。

+1

如果名稱包含特殊字符,名稱會自動被引用嗎?我不是PostgreSQL的用戶,但似乎有一個簡單的FORMAT()函數足夠聰明,可以做到這一點。 –

+2

@AndriyM ['format()'](http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER)函數中的'%I'插值佔位符是專門用於postgres標識符,並將安全地引用提供的值。 – dbenhur

+0

@dbenhur:哦,很好,謝謝。好的解決方案,克雷格! (顯然:) –