如何引用传入psql的命名参数?

jpm*_*c26 6 postgresql identifier keyword psql

psql有一个用于传递命名参数的构造:

psql -v name='value'
Run Code Online (Sandbox Code Playgroud)

然后可以在脚本中引用它:

SELECT :name;
Run Code Online (Sandbox Code Playgroud)

这将给出结果

 ?column?
----------
 value
(1 row)
Run Code Online (Sandbox Code Playgroud)

在开发过程中,我需要相当频繁地删除并重新创建数据库的副本,所以我正在尝试自动化该过程.所以我需要运行一个强制断开所有用户然后删除数据库的查询.但是这个操作的数据库会有所不同,因此数据库名称必须是一个参数.

问题是断开用户的查询需要string(WHERE pg_stat_activity.datname = 'dbname'),丢弃的查询需要一个不带引号的token(DROP DATABASE IF EXISTS dbname).(对不起.不知道该怎么称呼这种令牌.)

我可以在DROP查询中使用不带引号的命名参数,但在断开连接查询中引用命名参数会导致参数不被展开.即,我会得到字符串':name'而不是字符串'value'.

有没有办法将不带引号的值转换为字符串或将字符串转换为DROP查询的不带引号的标记?我可以通过将断开连接和DROP查询放在单独的脚本中并将带有引号的参数传递给断开连接并且不带引号到DROP来解决它,但我更喜欢它们在同一个脚本中,因为它们实际上是两个步骤在一个过程中.

Erw*_*ter 11

尝试:

WHERE pg_stat_activity.datname = :'name'

请注意单引号前的冒号位置.优秀的手册填写了这里的细节:

如果不带引号的参数以冒号(:)开头,则将其视为psql变量,并将变量的值用作参数.如果变量名称被单引号括起来(例如:'var'),它将作为SQL文本进行转义,结果将用作参数.如果变量名称被双引号括起来,它将作为SQL标识符进行转义,结果将用作参数.

大胆强调我的.