PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

как да използвате променливи в psql скрипт

Първо, опитвате се да свържете два низа с + оператор, но SQL операторът за конкатенация е || , с тази информация бихте могли да си помислите, че очакваният резултат ще бъде (няма да работи ):

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

Но! COPY очаква литерал низ за пътя, а не израз, така че наистина трябва да дадете пътя. Забележете, че ще работи за команди като SELECT , INSERT , UPDATE и т.н.

С тази информация можете да използвате само psql променливи, както Павел посочи, и свържете низовете в psql е променлива. Добро решение е да използвате psql 's :'var' синтаксис, който вмъква променливата като низ в 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);

Което ще генерира (ще изпрати до сървъра на 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);

Този :'var' синтаксис няма да работи на всички psql версии (не си спомням сега коя беше въведена), но за стари версии можете лесно да използвате котиране в долари:

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

Или избягайте в единични кавички:

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

Това е.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как се решава сканирането на растерна маса и сканирането на индекс?

  2. Елиминирайте двойните кавички от json поле по селективен начин в PostgreSQL

  3. SQL:Как да запазя реда в sql заявка?

  4. Мога ли да „прекомпилирам“ таблица, връщаща функции, след като тази таблица е ALTER-ed по време на миграцията на база данни?

  5. Как да прекъсна връзката с база данни и да се върна към базата данни по подразбиране в PostgreSQL?