3 回答

TA貢獻1801條經(jīng)驗 獲得超8個贊
Postgres變量是通過\ set命令創(chuàng)建的,例如...
\set myvariable value
...,然后可以替換為...
SELECT * FROM :myvariable.table1;
... 要么 ...
SELECT * FROM table1 WHERE :myvariable IS NULL;
編輯:從psql 9.1開始,變量可以用引號引起來,如下所示:
\set myvariable value
SELECT * FROM table1 WHERE column1 = :'myvariable';
在舊版本的psql客戶端中:
...如果要將變量用作條件字符串查詢中的值,例如...
SELECT * FROM table1 WHERE column1 = ':myvariable';
...那么您需要在變量本身中包含引號,因為上述內(nèi)容將無法正常工作。而是這樣定義您的變量...
\set myvariable 'value'
但是,如果像我一樣,您遇到了要從現(xiàn)有變量中創(chuàng)建字符串的情況,我發(fā)現(xiàn)竅門就是...
\set quoted_myvariable '\'' :myvariable '\''
現(xiàn)在,您同時具有相同字符串的帶引號和不帶引號的變量!而且你可以做這樣的事情....
INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;

TA貢獻1853條經(jīng)驗 獲得超9個贊
關(guān)于PSQL變量的最后一句話:
如果將它們用SQL語句括在單引號中,它們將不會擴展。因此,這不起作用:
SELECT * FROM foo WHERE bar = ':myvariable'
要在SQL語句中擴展為字符串文字,必須在變量集中包括引號。但是,變量值已經(jīng)必須用引號引起來,這意味著您需要第二組引號,并且必須對內(nèi)部引號進行轉(zhuǎn)義。因此,您需要:
\set myvariable '\'somestring\''
SELECT * FROM foo WHERE bar = :myvariable
編輯:從PostgreSQL 9.1開始,您可以改寫:
\set myvariable somestring
SELECT * FROM foo WHERE bar = :'myvariable'

TA貢獻1876條經(jīng)驗 獲得超5個贊
專門針對psql,您也可以psql從命令行傳遞變量。你可以通過他們-v。這是一個用法示例:
$ psql -v filepath=/path/to/my/directory/mydatafile.data regress
regress=> SELECT :'filepath';
?column?
---------------------------------------
/path/to/my/directory/mydatafile.data
(1 row)
注意,冒號未加引號,然后變量名稱“ self”被加引號。我知道語法很奇怪。這僅在psql中有效;(例如)PgAdmin-III無法使用。
這種替換發(fā)生在psql的輸入處理期間,因此您不能(說)定義一個函數(shù),該函數(shù)使用:'filepath'并期望在:'filepath'會話之間更改的值。定義函數(shù)后,它將被替換一次,之后將是一個常量。這對于腳本編寫很有用,但對運行時不起作用。
- 3 回答
- 0 關(guān)注
- 1308 瀏覽
添加回答
舉報