在psql中使用位置参数($ 1,..)

Kru*_*rut 6 postgresql variables string-interpolation psql

我经常想从我的程序代码中复制/粘贴sql并在psql中测试/调试,并且必须用文字值替换位置参数是很繁琐的.有一个很好的转换方式:

select * from users where name=$1 and email=$2; 
Run Code Online (Sandbox Code Playgroud)

至:

select * from users where name='troy' and email='t@me.com';
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 4

您可以使用psql 变量。这些是在 SQL 代码中插入的。根据文档:

psql 变量的一个关键特性是您可以将它们替换(“插值”)到常规 SQL 语句以及元命令的参数中。此外,psql 提供了确保用作 SQL 文字和标识符的变量值被正确引用的工具。在不使用任何引号的情况下插入值的语法是在变量名称前面添加冒号 ( :)。

请注意(根据文档):

名称必须由字母(包括非拉丁字母)、数字和下划线组成。

因此您无法使用 form 的位置参数$1。我假设您从函数体中复制这些代码,这就是位置参数的原因?
从 PostgreSQL 9.2 开始,甚至 SQL 函数也可以通过名称引用参数。根据文档:

SQL 函数的参数可以在函数体中使用名称或数字进行引用。

自 v8.0 以来,PL/pgSQL 函数一直支持函数体中的命名参数。

我首选的命名约定是在函数参数前面加上_以避免命名冲突。但这是品味和风格的问题。

只有一半的解决方案

所以,你的例子可以这样工作:

db=> \set _name 'troy'
db=> \set _email 't@me.com'
db=> select * from users where name=:'_name' and email=:'_email'; 
Run Code Online (Sandbox Code Playgroud)

您仍然需要准备查询字符串...
请注意 中的引号:'_name'quote_literal()这与应用于字符串具有相同的效果。手册中有详细说明。