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

How to test my ad-hoc SQL with parameters in Postgres query window

在 Microsoft SQL 服务器中,在查询 window:

中测试类似这样的内容
select * from Users where LastName = @lastname

我可以在命令前添加:

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

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

可能是用DO指令来模拟一个功能。这样您就可以声明变量并使用它们来执行您的查询!

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

多种选择。

CTE 中提供参数以在 中具有“变量”纯 SQL:

WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM   users<b>, var v</b>
WHERE  lastname = <b>v.lastname</b>;

这适用于任何 查询。
由于 CTE var 包含 单行 ,因此可以安全地在其末尾附加 CROSS JOIN FROM 子句 - 实际上,在逗号之后附加它的缩写形式可能是最好的,因为显式连接语法绑定在逗号之前。额外的 table 别名 v 是可选的,以进一步缩短语法。

没有 CTE 更便宜。顺便说一句,为什么 varchar(16)?只需使用 text:

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

使用临时tableall[=105=起到类似的作用] 在同一会话中查询。 Temp tables 在会话结束时消失。

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 语句,如@Houari 提供的或此处演示的类似语句:

  • PostgreSQL loops outside functions. Is that possible?

请注意,您不能 return 来自 DO 语句的值。 (尽管您可以使用 RAISE ...。)并且您不能在 plpgsql 中使用没有目标的 SELECT - DO 语句中的默认过程语言。将 SELECT 替换为 PERFORM 以丢弃结果。

或者你可以使用customized options,你可以在postgresql.conf中设置全局可见.

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

SET my.lastname = 'Troy';

变量名必须包含一个点。通过这种方式,您只能使用 text 作为数据类型,但任何数据类型都可以表示为 text ...

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

使用SET LOCAL效果只持续当前交易.参见:

  • Passing user id to PostgreSQL triggers

你可以使用微小的IMMUTABLE函数作为全局持久变量只有特权用户才能操作。参见:

  • Is there a way to define a named constant in a PostgreSQL query?

psql as client, use the \set or \gset meta-commands and variable substitution 一起工作时。

我配置 postgres 记录所有命令,并从日志文件中复制命令,因此所有参数都已替换为值,并在查询中测试命令 window.

可能不是最好的方法,但它很简单并且适合我