PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como INSERT INTO tabela de consulta dinâmica?


A consulta básica para construir o comando dinamicamente:
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
            , tbl_des, col_des, col_src, tbl_src) As sql
FROM   table3;

Isso produz uma consulta como:
INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"

Observe a ortografia em maiúsculas citada. Ao contrário dos comandos SQL, onde os identificadores sem aspas são convertidos em minúsculas automaticamente, as strings em sua tabela agora diferenciam maiúsculas de minúsculas!

Eu sugiro que você nunca identificadores de aspas duplas e use exclusivamente nomes legais em letras minúsculas.

Para automatizar:
DO
$$BEGIN
   EXECUTE (
      SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
                  , tbl_des, col_des, col_src, tbl_src) As sql
      FROM   table3
      -- WHERE table3_id = 123  -- select only *one* row!
      );
END$$;

Você precisa para entender o format() função. Leia o manual .

Você também pode envolver isso em uma função plpgsql e passar parâmetros adicionais: