在Microsoft SQL Server中,要在查询窗口中测试类似的内容:
select * from Users where LastName = @lastname
我可以在命令之前添加:
declare @lastname varchar(16)
set @lastname = 'Troy'
但是在PostgreSQL中,我找不到类似的方法。似乎我唯一能做的就是直接用它的值替换参数名称。当ad-hoc查询变得复杂并且多次使用相同的参数时,它变得很难。有办法吗?
答案 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
是可选的,可进一步缩短语法。
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 options,SELECT
可以在postgresql.conf
中设置为 全球 。< / p>
或在您的会话中设置为在会话期间可见,并且仅在同一会话中 :
SET my.lastname = 'Troy';
变量名称必须包含一个点。您以这种方式限制为text
作为数据类型,但任何数据类型都可以表示为text
...
您可以使用current_setting('my.lastname')
作为值表达式。如果需要,可以投射。例如:current_setting('my.json_var')::json
...
或使用SET LOCAL
效果仅针对当前的 交易 。
@Craig的相关答案:
或您可以使用微弱的 IMMUTABLE
函数作为全局持久化变量,只有特权用户才能操作:
此相关答案也有类似的选项列表。
拥有\set
或\gset
元命令并提供variable substitution in the client。
pgAdmin查询窗口提供扩展名pgScript。
答案 1 :(得分:3)
也许使用DO指令来模拟一个函数。通过这种方式,您可以声明变量并使用它们来执行查询!
答案 2 :(得分:0)
我配置postgres来记录所有命令,并从日志文件中复制命令,所以所有参数都已经被值替换,并在查询窗口中测试命令。
可能不是最好的方法,但它很容易,对我有用