如何使用Postgres查询窗口中的参数测试我的临时SQL

时间:2015-05-11 23:48:01

标签: sql postgresql parameterized-query

在Microsoft SQL Server中,要在查询窗口中测试类似的内容:

select * from Users where LastName = @lastname

我可以在命令之前添加:

declare @lastname varchar(16)
set @lastname = 'Troy'

但是在PostgreSQL中,我找不到类似的方法。似乎我唯一能做的就是直接用它的值替换参数名称。当ad-hoc查询变得复杂并且多次使用相同的参数时,它变得很难。有办法吗?

3 个答案:

答案 0 :(得分:7)

各种选择。

CTE中提供参数以在纯SQL 中包含“变量”:

YMeteor

这适用于任何查询 由于CTE WITH var(lastname) AS (SELECT 'Troy'::varchar(16)) SELECT * FROM users, var v WHERE lastname = v.lastname;拥有 单行 ,因此可以安全地在FROM子句的末尾附加var - 实际上是短的在逗号之后附加它的表单可能是最好的,因为显式连接语法在逗号之前绑定。附加表别名CROSS JOIN是可选的,可进一步缩短语法。

没有CTE,

OR 更便宜。顺便说一句,为什么v?只需使用varchar(16)

text

使用临时表在同一会话中为所有查询扮演类似角色。临时表在会话结束时死亡。

SELECT *
FROM   users
JOIN  (SELECT 'Troy'::text) var(lastname) USING (lastname);

您可以使用@Houari提供的 CREATE TEMP TABLE var AS SELECT text 'Troy' AS lastname; ANALYZE var; -- temp tables are not covered by autovacuum SELECT * FROM users JOIN var USING (lastname); 语句,或者在此处演示:

请注意,您无法从DO语句返回值。 (您可以使用DO。)并且您不能在plpgsql中使用RAISE ...而没有目标 - 这是SELECT语句中的默认过程语言。将DO替换为PERFORM以丢弃结果。

您可以使用customized optionsSELECT可以在postgresql.conf中设置为 全球 。< / p>

在您的会话中设置为在会话期间可见,并且仅在同一会话中

SET my.lastname = 'Troy';

变量名称​​必须包含一个点。您以这种方式限制为text作为数据类型,但任何数据类型都可以表示为text ...

您可以使用current_setting('my.lastname')作为值表达式。如果需要,可以投射。例如:current_setting('my.json_var')::json ...

使用SET LOCAL效果仅针对当前的 交易

@Craig的相关答案:

您可以使用微弱的 IMMUTABLE函数作为全局持久化变量,只有特权用户才能操作:

此相关答案也有类似的选项列表。

psql

拥有\set\gset元命令并提供variable substitution in the client

pgAdmin

pgAdmin查询窗口提供扩展名pgScript

答案 1 :(得分:3)

也许使用DO指令来模拟一个函数。通过这种方式,您可以声明变量并使用它们来执行查询!

http://www.postgresql.org/docs/9.4/static/sql-do.html

答案 2 :(得分:0)

我配置postgres来记录所有命令,并从日志文件中复制命令,所以所有参数都已经被值替换,并在查询窗口中测试命令。

可能不是最好的方法,但它很容易,对我有用