sql >> Base de Datos >  >> RDS >> PostgreSQL

Filtre los nombres de columna de la tabla existente para la declaración SQL DDL

Compile el comando DDL dinámicamente. Puedes hacerlo en dos pasos:

  1. Declaración de compilación:

    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. (¡Compruebe que está bien!) Luego ejecute la declaración generada en un segundo viaje de ida y vuelta al servidor.

Esto se basa en la vista de esquema de información information_schema.columns . Alternativamente, podría usar pg_catalog.pg_attribute . Relacionado:

Pero también se puede hacer en un solo viaje de ida y vuelta al servidor:

Con un DO declaración de cualquier cliente

DO es solo un contenedor simple para la ejecución ad-hoc de código PL/pgSQL. Puede hacer lo mismo en una función o procedimiento.

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
$$;

Más simple con el meta-comando psql \gexec

Ya que mencionó el terminal interactiva predeterminada psql . Allí puede usar \gexec . Es...

Entonces:

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