我希望用返回的字符串從下面的查詢作爲其他查詢表名。
SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')
你可以看到它返回一個字符串。我希望將它用作另一個查詢的輸入,例如
CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd'))
AS * SELECT FROM backup
可以這樣做嗎?任何線索如何?
我希望用返回的字符串從下面的查詢作爲其他查詢表名。
SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')
你可以看到它返回一個字符串。我希望將它用作另一個查詢的輸入,例如
CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd'))
AS * SELECT FROM backup
可以這樣做嗎?任何線索如何?
您將需要使用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
電話。
如果名稱包含特殊字符,名稱會自動被引用嗎?我不是PostgreSQL的用戶,但似乎有一個簡單的FORMAT()函數足夠聰明,可以做到這一點。 –
@AndriyM ['format()'](http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER)函數中的'%I'插值佔位符是專門用於postgres標識符,並將安全地引用提供的值。 – dbenhur
@dbenhur:哦,很好,謝謝。好的解決方案,克雷格! (顯然:) –
我有解決方案,不適用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; –