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

Car*_*rol 5 sql postgresql parameterized-query

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

select * from Users where LastName = @lastname
Run Code Online (Sandbox Code Playgroud)

我可以在命令之前添加这个:

declare @lastname varchar(16)
set @lastname = 'Troy'
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 7

各种选择.

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

WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM   users, var v
WHERE  lastname = v.lastname;
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT *
FROM   users
JOIN  (SELECT 'Troy'::text) var(lastname) USING (lastname);
Run Code Online (Sandbox Code Playgroud)

或者使用临时表为同一会话中的所有查询播放类似的角色.临时表在会话结束时死亡.

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);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用DO@Houari提供的语句或类似于此处演示的语句:

请注意,您无法从DO语句返回值.(你可以使用RAISE ....)并且你不能SELECT在plpgsql中使用没有目标 - 一个DO语句中的默认过程语言.更换SELECTPERFORM扔掉的结果.

或者您可以使用自定义选项,您可以将其设置postgresql.conf全局可见.

或者在会话中设置在会话期间可见,并且仅在同一会话中显示:

SET my.lastname = 'Troy';
Run Code Online (Sandbox Code Playgroud)

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

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

或者使用SET LOCAL效果仅持续当前事务.

@Craig的相关回答:

或者,您可以将微小IMMUTABLE函数用作全局持久变量,只有特权用户才能操作:

这个相关的答案也有类似的选项列表.

PSQL

拥有\set或使用\gset元命令并在客户端中提供变量替换.

pgAdmin的

pgAdmin查询窗口提供扩展名pgScript.


Car*_*rol 0

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

可能不是最好的方法,但它很简单并且对我有用