我经常想从我的程序代码中复制/粘贴sql并在psql中测试/调试,并且必须用文字值替换位置参数是很繁琐的。是否有一种转换的好方法:
select * from users where name=$1 and email=$2;
为:
select * from users where name='troy' and email='t@me.com';
答案 0 :(得分:3)
您可以使用psql variables。这些是在SQL代码中插入的。 Per documentation:
psql变量的一个关键特性是你可以替换 (“插入”)它们成为常规的SQL语句,以及 元命令的参数。此外,psql提供了工具 确保用作SQL文字和标识符的变量值 适当引用。内插值的语法没有任何 引用是用冒号(
:
)前缀变量名。
请注意(per documentation):
名称必须由字母(包括非拉丁字母),数字和下划线组成。
因此,您无法处理$1
形式的位置参数。我假设您从函数体中复制这些代码片段,这就是位置参数的原因?
从PostgreSQL 9.2开始,即使SQL函数也可以按名称引用参数。 Per documentation:
可以使用名称或数字在函数体中引用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';
您仍然需要准备查询字符串...
请注意:'_name'
中的引号。这与在字符串上应用quote_literal()
具有相同的效果。 Details in the manual.
答案 1 :(得分:1)
它并不比运行原始查询好多了,但假设您的示例只是一个简单的例子而实际查询涉及的更多,您可以创建一个函数:
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', 't@me.com')
再次以你的例子来说,这并没有多大帮助,但我已经将它用于带有大量连接的大查询,并且它运行良好。