PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie INSERT INTO Tabelle aus dynamischer Abfrage?

Die grundlegende Abfrage zum dynamischen Erstellen des Befehls:

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

Dies erzeugt eine Abfrage wie:

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

Beachten Sie die zitierte Großschreibung. Anders als bei SQL-Befehlen, wo Bezeichner ohne Anführungszeichen automatisch in Kleinbuchstaben umgewandelt werden, wird bei den Zeichenfolgen in Ihrer Tabelle jetzt zwischen Groß- und Kleinschreibung unterschieden!

Ich empfehle Ihnen niemals Bezeichner in doppelte Anführungszeichen setzen und ausschließlich zulässige Namen in Kleinbuchstaben verwenden.

Automatisieren:

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

Sie brauchen um den format() Funktion. Lesen Sie das Handbuch .

Sie können dies auch in eine plpgsql-Funktion packen und zusätzliche Parameter übergeben: