猿问

如何在psql中使用脚本变量?

在MS SQL Server中,我创建了脚本以使用可自定义的变量:


DECLARE @somevariable int  

SELECT @somevariable = -1


INSERT INTO foo VALUES ( @somevariable )

然后,我将@somevariable在运行时更改值,具体取决于在特定情况下所需的值。由于它位于脚本的顶部,因此很容易看到和记住。


如何使用PostgreSQL客户端执行相同的操作psql?


HUWWW
浏览 1271回答 3
3回答

蝴蝶刀刀

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;

暮色呼如

关于PSQL变量的最后一句话:如果将它们用SQL语句括在单引号中,它们将不会扩展。因此,这不起作用:SELECT * FROM foo WHERE bar = ':myvariable'要在SQL语句中扩展为字符串文字,必须在变量集中包括引号。但是,变量值已经必须用引号引起来,这意味着您需要第二组引号,并且必须对内部引号进行转义。因此,您需要:\set myvariable '\'somestring\''  SELECT * FROM foo WHERE bar = :myvariable编辑:从PostgreSQL 9.1开始,您可以改写:\set myvariable somestringSELECT * FROM foo WHERE bar = :'myvariable'

慕运维8079593

专门针对psql,您也可以psql从命令行传递变量。你可以通过他们-v。这是一个用法示例:$ psql -v filepath=/path/to/my/directory/mydatafile.data regressregress=> SELECT :'filepath';               ?column?                --------------------------------------- /path/to/my/directory/mydatafile.data(1 row)注意,冒号未加引号,然后变量名称“ self”被加引号。我知道语法很奇怪。这仅在psql中有效;(例如)PgAdmin-III无法使用。这种替换发生在psql的输入处理期间,因此您不能(说)定义一个函数,该函数使用:'filepath'并期望在:'filepath'会话之间更改的值。定义函数后,它将被替换一次,之后将是一个常量。这对于脚本编写很有用,但对运行时不起作用。
随时随地看视频慕课网APP

相关分类

SQL Server
我要回答