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查询变得复杂并且多次使用相同的参数时,它变得很难.有办法吗?
各种选择.
在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
语句中的默认过程语言.更换SELECT
用PERFORM
扔掉的结果.
或者您可以使用自定义选项,您可以将其设置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
函数用作全局持久变量,只有特权用户才能操作:
这个相关的答案也有类似的选项列表.
拥有\set
或使用\gset
元命令并在客户端中提供变量替换.
pgAdmin查询窗口提供扩展名pgScript.
归档时间: |
|
查看次数: |
1930 次 |
最近记录: |