sql >> Databasteknik >  >> RDS >> PostgreSQL

hur man använder variabler i ett psql-skript

Först och främst försöker du sammanfoga två strängar med + operator, men SQL-operatorn för sammanlänkning är || , med den informationen skulle du kunna tro att det förväntade resultatet skulle vara (fungerar inte ):

\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 kommandot förvänta dig en bokstavlig sträng för sökvägen, inte ett uttryck, så du borde verkligen ge sökvägen. Observera att det skulle fungera för kommandon som SELECT , INSERT , UPDATE osv.

Med den informationen kan du bara använda psql variabler, som Pavel påpekade, och sammanfoga strängarna till en psql s variabel. En bra lösning är att använda psql 's :'var' syntax, som infogar variabeln som en sträng i SQL-uttrycket:

\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 kommer att generera (kommer att skicka till 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);

Denna :'var' syntax fungerar inte på alla psql versioner (jag kommer inte ihåg nu vilken detta introducerades), men för gamla versioner kan du enkelt använda 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 fly in i enstaka citattecken:

\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 är det.



  1. SQL IN Klausul 1000 objektgräns

  2. Infoga och uppdatera CSV-fildata i MySQL-tabellen med PHP

  3. Finns det något sätt att använda FORALL för att infoga data från en array?

  4. Kopiera data mellan Oracle-scheman med SQL