如何使用 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指令来模拟一个功能。这样您就可以声明变量并使用它们来执行您的查询!
多种选择。
在 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;
或使用临时table为all[=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.
可能不是最好的方法,但它很简单并且适合我
在 Microsoft SQL 服务器中,在查询 window:
中测试类似这样的内容select * from Users where LastName = @lastname
我可以在命令前添加:
declare @lastname varchar(16)
set @lastname = 'Troy'
但是在 PostgreSQL 中,我找不到类似的方法。看来我唯一能做的就是直接用它的值替换参数名称。当临时查询变得复杂并且同一参数被多次使用时,它会变得困难。有办法吗?
可能是用DO指令来模拟一个功能。这样您就可以声明变量并使用它们来执行您的查询!
多种选择。
在 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;
或使用临时table为all[=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.
可能不是最好的方法,但它很简单并且适合我