Ich weiß nicht, woher Sie diese Syntax haben, aber COPY
nimmt keine solche Liste von Spaltenaliasen. Siehe Hilfe:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
ist keine der aufgelisteten Optionen; Um die vollständige Ausgabe anzuzeigen, führen Sie \d copy
aus in psql, oder schauen Sie im Handbuch nach copy
Befehl online).
Es gibt keine Zuordnungsfunktion in COPY
Dadurch können Sie nur einige Spalten der Eingabe-CSV lesen. Es wäre wirklich nützlich, aber niemand hatte bisher die Zeit/das Interesse/die Finanzierung, es umzusetzen. Es ist wirklich nur eine von vielen Datenumwandlungs-/Filteraufgaben, die die Leute sowieso wollen.
PostgreSQL erwartet die in COPY
angegebene Spaltenliste in der gleichen Reihenfolge von links nach rechts wie in der CSV-Datei sein und die gleiche Anzahl von Einträgen haben wie die CSV-Datei Spalten hat. Wenn Sie also schreiben:
COPY con (date,kgs)
dann erwartet PostgreSQL eine Eingabe-CSV mit genau zwei Spalten . Es verwendet die erste CSV-Spalte für das "date"
Tabellenspalte und die zweite CSV-Spalte für "kgs"
Tabellenspalte. Es spielt keine Rolle, was die CSV-Header sind, sie werden ignoriert, wenn Sie WITH (FORMAT CSV, HEADER ON)
angeben , oder als normale Datenzeilen behandelt, wenn Sie HEADER
nicht angeben .
PostgreSQL 9.4 fügt FROM PROGRAM
hinzu zu COPY
, sodass Sie einen Shell-Befehl ausführen könnten, um die Datei zu lesen und zu filtern. Ein einfaches Python- oder Perl-Skript würde die Arbeit erledigen.
Wenn es sich um eine kleine Datei handelt, öffnen Sie einfach eine Kopie in der Tabelle Ihrer Wahl als CSV-Datei, löschen Sie die unerwünschten Spalten und speichern Sie sie, also nur das date
und kgs
Spalten bleiben.
Alternativ COPY
in eine Staging-Tabelle, die dieselben Spalten wie die CSV
hat , dann INSERT INTO ... SELECT
um nur die gewünschten Daten in die reale Zieltabelle zu übertragen.