3 回答
TA贡献1801条经验 获得超8个赞
Postgres变量是通过\ set命令创建的,例如...
\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';
...那么您需要在变量本身中包含引号,因为上述内容将无法正常工作。而是这样定义您的变量...
\set myvariable 'value'
但是,如果像我一样,您遇到了要从现有变量中创建字符串的情况,我发现窍门就是...
\set quoted_myvariable '\'' :myvariable '\''
现在,您同时具有相同字符串的带引号和不带引号的变量!而且你可以做这样的事情....
INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;
TA贡献1853条经验 获得超9个赞
关于PSQL变量的最后一句话:
如果将它们用SQL语句括在单引号中,它们将不会扩展。因此,这不起作用:
SELECT * FROM foo WHERE bar = ':myvariable'
要在SQL语句中扩展为字符串文字,必须在变量集中包括引号。但是,变量值已经必须用引号引起来,这意味着您需要第二组引号,并且必须对内部引号进行转义。因此,您需要:
\set myvariable '\'somestring\''
SELECT * FROM foo WHERE bar = :myvariable
编辑:从PostgreSQL 9.1开始,您可以改写:
\set myvariable somestring
SELECT * FROM foo WHERE bar = :'myvariable'
TA贡献1876条经验 获得超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无法使用。
这种替换发生在psql的输入处理期间,因此您不能(说)定义一个函数,该函数使用:'filepath'并期望在:'filepath'会话之间更改的值。定义函数后,它将被替换一次,之后将是一个常量。这对于脚本编写很有用,但对运行时不起作用。
- 3 回答
- 0 关注
- 1268 浏览
添加回答
举报