sql >> Database teknologi >  >> RDS >> PostgreSQL

KOPIERE kun nogle kolonner fra en input CSV?

Jeg ved ikke, hvor du har den syntaks fra, men COPY tager ikke sådan en liste over kolonnealiaser. Se hjælpen:

COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | PROGRAM 'command' | STDIN } [ [ WITH ] ( option [, ...] ) ]

(AS er ikke en af ​​de angivne muligheder; for at se den fulde outputkørsel \d copy i psql, eller se i manualen for copy kommando online).

Der er ingen kortlægningsfunktion i COPY der kun lader dig læse nogle kolonner i input CSV. Det ville være rigtig nyttigt, men ingen har haft tid/interesse/finansiering til at implementere det endnu. Det er i virkeligheden kun én af mange datatransformations-/filtreringsopgaver, som folk ønsker.

PostgreSQL forventer kolonnelisten angivet i COPY at være i samme rækkefølge, fra venstre mod højre, som det, der er i CSV-filen, og have det samme antal poster, som CSV-filen har kolonner. Så hvis du skriver:

COPY con (date,kgs)
 

så forventer PostgreSQL en input-CSV med præcis to kolonner . Den bruger den første csv-kolonne til "date" tabelkolonne og den anden csv-kolonne for "kgs" tabel kolonne. Det er ligeglad med, hvad CSV-headerne er, de ignoreres, hvis du angiver WITH (FORMAT CSV, HEADER ON) , eller behandlet som normale datarækker, hvis du ikke angiver HEADER .

PostgreSQL 9.4 tilføjer FROM PROGRAM til COPY , så du kan køre en shell-kommando for at læse filen og filtrere den. Et simpelt Python- eller Perl-script ville gøre jobbet.

Hvis det er en lille fil, skal du blot åbne en kopi i regnearket efter eget valg som en csv-fil, slette de uønskede kolonner og gemme den, så kun date og kgs kolonner forbliver.

Alternativt COPY til en iscenesættelsestabel, der har alle de samme kolonner som CSV , og lav derefter en INSERT INTO ... SELECT at overføre netop de ønskede data til den rigtige måltabel.




  1. SQLAlchemy-arv virker ikke

  2. Foretrukken metode til materialiserede visninger (sammendragstabeller) med MySQL

  3. kommasepareret parameter i plsql-lagret procedure

  4. Hvordan gemmer man et link i mysql?