29

重複の可能性:
Postgres 動的クエリ関数

以下のクエリから返された文字列を、他のクエリのテーブル名として使用したいと考えています。

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

ご覧のとおり、文字列を返します。別のクエリの入力として使用したい。

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

それはできますか?方法の手がかりはありますか?

4

1 に答える 1

57

ブロックまたは PL/PgSQL 関数 ( )を介してPL/PgSQLEXECUTEステートメントを使用する必要があります。動的 SQL は、PostgreSQL で使用される通常の SQL 方言ではサポートされておらず、手続き型の PL/PgSQL バリアントでのみサポートされています。DOCREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql

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

format(...)functionとformat-specifiersは、それぞれ適切な識別子とリテラルの引用を行います%I%L

リテラルについては、 withではEXECUTE ... USINGなくを使用することをお勧めしますが、テーブル名や列名などの識別子については、形式パターンは冗長呼び出しに代わる簡潔な代替手段です。format(...)%L%Iquote_ident

于 2012-11-08T13:33:53.650 に答える