sql >> データベース >  >> RDS >> PostgreSQL

SQLDDLステートメントの既存のテーブルから列名をフィルタリングします

    DDLコマンドを動的に作成します。あなたは2つのステップでそれを行うことができます:

    1. ビルドステートメント:

      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. (問題がないことを確認してください!)次に、生成されたステートメントをサーバーへの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
    



    1. Oracleの日付からJavaの日付

    2. Oracleでビューを作成する方法

    3. PHP SimpleHTMLDOMパーサーでの文字エンコードの問題

    4. node-pgのテーブル名として変数を使用するにはどうすればよいですか?