我经常想从程序代码中复制/粘贴 sql 并在 psql 中测试/调试,并且必须用文字值替换位置参数是很乏味的。有没有好的转换方法:
select * from users where name=$1 and email=$2;
至:
select * from users where name='troy' and email='[email protected]';
您可以使用psql变量。这些可以插入到 SQL 代码中。 说明书:
psql 变量的一个关键特性是您可以替换 (“插值”)它们到常规 SQL 语句中,以及 元命令的参数。此外,psql 还提供了以下功能: 确保用作 SQL 文字和标识符的变量值是 正确引用。不带任何值插值的语法 引用是在变量名前面加上冒号 (
)。:
请注意(根据文档):
名称必须由字母(包括非拉丁字母)、数字和下划线组成。
所以你不能使用像
$1
这样的序数引用。我假设您从函数体中复制这些代码片段,这就是序数引用的原因?可以使用名称或数字在函数体中引用 SQL 函数的参数。
自 v8.0 起,PL/pgSQL 函数支持函数体中的命名参数。
我的首选命名约定是在函数参数前面加上
_
以避免命名冲突。但这是品味和风格的问题。
因此,您的示例可以在 psql 中像这样工作:
db=> \set _name 'troy'
db=> \set _email '[email protected]'
db=> select * from users where name=:'_name' and email=:'_email';
您仍然需要准备查询字符串...
请注意
:'_name'
中的引号。这与在字符串上应用 quote_literal()
具有相同的效果。 详情请参阅手册。
这并不比仅仅运行原始查询好多少,但假设您的示例只是一个简单的示例,并且实际查询涉及更多一点,您可以创建一个函数:
CREATE OR REPLACE FUNCTION get_users(user_name varchar, email_addr varchar)
RETURNS SETOF users AS
$BODY$
select *
from users
where
name = user_name and
name = email_addr
$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;
要获得结果,您需要:
select * from get_users('troy', '[email protected]')
再次以您的示例为例,这并没有多大帮助,但我已经将其用于具有大量连接的大型查询,并且效果很好。