Ciò che descrivi nella tua domanda ovviamente non è ciò che sta realmente accadendo. COPY
non riuscirebbe a importare stringhe letterali con virgolette singole ridondanti in una date
colonna.
Per eliminare le virgolette ridondanti, importa in una tabella temporanea con text
colonna, quindi INSERT INTO
la tabella di destinazione rifilando le virgolette:
CREATE TEMP TABLE wtmp (
city text
, temp_lo int
, temp_hi int
, prcp real
, date text -- note how I use text here.
);
COPY wtmp FROM '~aviad/postsgres/playground/weather.txt';
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
SELECT city, temp_lo, temp_hi, prcp, trim(date, '''')::date
FROM wtmp
-- ORDER BY ?
;
La tabella temporanea viene eliminata automaticamente alla fine della sessione.
Parole riservate come identificatori
Vedo che hai copiato l'esempio dal manuale. Ecco il collegamento profondo al manuale corrente .
Pur essendo corretto, quell'esempio nel manuale è sfortunato. Consiglio di non utilizzare parole riservate come date
come nomi di colonna. Come puoi vedere qui
date
è una parola riservata in ogni standard SQL. È consentito l'uso in Postgres e posso vedere come sia allettante per un semplice esempio. Ma questo non la rende una buona idea. In generale, dovresti avere l'abitudine di evitare parole riservate come identificatori. Porta a messaggi di errore confusi e codice SQL inutilmente incompatibile.