DDLコマンドを動的に作成します。あなたは2つのステップでそれを行うことができます:
-
ビルドステートメント:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT ' || string_agg(column_name, ', ' ORDER BY ordinal_position) || ' FROM original.table' FROM information_schema.columns WHERE table_schema = 'original' AND table_name = 'table' AND column_name NOT IN ('column_1', 'column_2');
-
(問題がないことを確認してください!)次に、生成されたステートメントをサーバーへの2回目のラウンドトリップで実行します。
これは、情報スキーマビュー information_schema.columns
>
。または、 pg_catalog.pg_attribute
を使用することもできます。
。関連:
ただし、サーバーへの1回のラウンドトリップでも実行できます:
DO
を使用 任意のクライアントからの声明
DO
PL/pgSQLコードをアドホックに実行するための単純なラッパーです。関数やプロシージャでも同じことを行うことができます。
DO
$$
BEGIN
EXECUTE (
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')
);
END
$$;
psqlメタコマンド\gexec
を使用すると簡単になります
デフォルトのインタラクティブ端末psql
について言及したので、
。そこで、 \ gexec
を使用できます 。それ...
だから:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')\gexec