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

时间:2014-08-01 23:34:25

标签: postgresql variables psql string-interpolation

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

select * from users where name=$1 and email=$2; 

为:

select * from users where name='troy' and email='t@me.com';

2 个答案:

答案 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')

再次以你的例子来说,这并没有多大帮助,但我已经将它用于带有大量连接的大查询,并且它运行良好。