sql >> Databáze >  >> RDS >> PostgreSQL

jak používat proměnné ve skriptu psql

Nejprve se pokoušíte zřetězit dva řetězce pomocí + operátor, ale operátor SQL pro zřetězení je || , s těmito informacemi byste si mohli myslet, že očekávaný výsledek bude (nebude fungovat ):

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

Ale! COPY příkaz očekávejte doslovný řetězec pro cestu, nikoli výraz, takže byste opravdu měli zadat cestu. Všimněte si, že by to fungovalo pro příkazy jako SELECT , INSERT , UPDATE , atd.

S těmito informacemi můžete použít pouze psql proměnných, jak ukázal Pavel, a zřetězit řetězce do psql proměnná. Dobrým řešením je použít psql 's :'var' syntaxe, která vloží proměnnou jako řetězec do SQL výrazu:

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

Což vygeneruje (odešle na server 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);

Tento :'var' syntaxe nebude fungovat na všech psql verze (už si nevzpomínám, která z nich byla představena), ale pro staré verze můžete snadno použít dolarové kotace:

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

Nebo unikněte do jednoduchých uvozovek:

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

To je ono.



  1. Uložení USER_ID uživatele, který smazal záznam se spouštěčem v MySQL

  2. Django - hodnota null ve sloupci porušuje omezení ne-null v Django Admin

  3. Mysql 5.5.10 - Mac 10.6.x - automatické spuštění

  4. Ceny hotelových pokojů pro různá roční období