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

come usare le variabili in uno script psql

Prima di tutto, stai cercando di concatenare due stringhe con + operatore, ma l'operatore SQL per la concatenazione è || , con queste informazioni potresti pensare che il risultato atteso sarebbe (non funzionerà ):

\set path '''c:\\server\\data\\'''
COPY paymentMethods (name,regexString) FROM :path || 'paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :path || 'priceLevels.csv' WITH (FORMAT csv, HEADER false);

Ma! Il COPY comando aspetta una stringa letterale per il percorso, non un'espressione, quindi dovresti davvero dare il percorso. Nota che funzionerebbe per comandi come SELECT , INSERT , UPDATE , ecc.

Con queste informazioni, puoi usare solo psql variabili, come indicato da Pavel, e concatenare le stringhe in un psql è variabile. Una buona soluzione è usare psql 's :'var' sintassi, che inserisce la variabile come stringa nell'espressione SQL:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM :'paymentMethodsPath' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :'priceLevels' WITH (FORMAT csv, HEADER false);

Che genererà (invierà al server di PostgreSQL):

COPY paymentMethods (name,regexString) FROM E'c:\\server\\data\\paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM E'c:\\server\\data\\priceLevels.csv' WITH (FORMAT csv, HEADER false);

Questo :'var' la sintassi non funzionerà su tutti i psql versioni (non ricordo ora quale sia stata introdotta), ma per le vecchie versioni puoi facilmente usare la citazione del dollaro:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM $$:paymentMethodsPath$$ WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM $$:priceLevels$$ WITH (FORMAT csv, HEADER false);

O scappa tra virgolette singole:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath 'E''':path'paymentMethods.csv'''
\set priceLevelsPath 'E''':path'priceLevels.csv'''
COPY paymentMethods (name,regexString) FROM :paymentMethodsPath WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :priceLevels WITH (FORMAT csv, HEADER false);

Questo è tutto.