PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment INSERT INTO table à partir d'une requête dynamique ?

La requête de base pour construire dynamiquement la commande :

SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
            , tbl_des, col_des, col_src, tbl_src) As sql
FROM   table3;

Cela produit une requête comme :

INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"

Notez l'orthographe citée en majuscules. Contrairement aux commandes SQL, où les identifiants sans guillemets sont automatiquement mis en minuscules, les chaînes de votre table sont désormais sensibles à la casse !

Je vous suggère de jamais identificateurs entre guillemets doubles et utilisez exclusivement des noms légaux en minuscules.

Pour automatiser :

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

Vous avez besoin pour comprendre le format() fonction. Lire le manuel .

Vous pouvez également intégrer cela dans une fonction plpgsql et passer des paramètres supplémentaires :