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

hvordan man bruger variabler i et psql-script

Først og fremmest forsøger du at sammenkæde to strenge med + operator, men SQL-operatoren for sammenkædning er || , med disse oplysninger kunne du tro, at det forventede resultat ville være (virker ikke ):

\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);

Men! COPY kommandoen forventer en bogstavelig streng for stien, ikke et udtryk, så du bør virkelig give stien. Bemærk, at det ville fungere for kommandoer som SELECT , INSERT , UPDATE osv.

Med disse oplysninger kan du kun bruge psql variabler, som Pavel påpegede, og sammenkæde strengene til en psql 's variabel. En god løsning er at bruge psql 's :'var' syntaks, der indsætter variablen som en streng i SQL-udtrykket:

\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);

Som vil generere (vil sende til PostgreSQL's server):

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

Denne :'var' syntaks vil ikke fungere på alle psql versioner (jeg husker ikke nu hvilken dette blev introduceret), men for gamle versioner kan du nemt bruge dollar-citering:

\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);

Eller undslip ind i enkelte anførselstegn:

\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);

Det er det.



  1. Sådan henter du rækker i den påkrævede rækkefølge i mysql

  2. Oracle ORA-12154:TNS:Kunne ikke løse tjenestenavnsfejl?

  3. INSTR() Funktion i Oracle

  4. MariaDB NULLIF() Forklaret