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

问题描述 投票:0回答:2

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

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

至:

select * from users where name='troy' and email='[email protected]';
postgresql variables psql string-interpolation
2个回答
4
投票

您可以使用psql变量。这些可以插入到 SQL 代码中。 说明书:

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

:
)。

请注意(根据文档):

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

所以你不能使用像

$1
这样的序数引用。我假设您从函数体中复制这些代码片段,这就是序数引用的原因?
从 PostgreSQL 9.2 开始,甚至 SQL 函数也可以通过名称引用参数。 说明书:

可以使用名称或数字在函数体中引用 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()
具有相同的效果。 详情请参阅手册。


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', '[email protected]')

再次以您的示例为例,这并没有多大帮助,但我已经将其用于具有大量连接的大型查询,并且效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.