postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量

sql - 如何在PostgreSQL查询中声明变量

如何声明变量以用于PostgreSQL 8.3查询?

在MS SQL Server中,我可以这样做:

DECLARE @myvar INT

SET @myvar = 5

SELECT *

FROM somewhere

WHERE something = @myvar

我如何在PostgreSQL中做同样的事情? 根据文档变量被简单地声明为“名称类型;”,但这给了我一个语法错误:

myvar INTEGER;

有人能给我一个正确语法的例子吗?

8个解决方案

146 votes

我通过使用WITH条款完成了相同的目标,它没有那么优雅,但可以做同样的事情。 虽然这个例子真的有点过分。 我也不特别推荐这个。

WITH myconstants (var1, var2) as (

values (5, 'foo')

)

SELECT *

FROM somewhere, myconstants

WHERE something = var1

OR something_else = var2;

fei0x answered 2019-05-09T12:34:14Z

65 votes

PostgreSQL中没有这样的功能。 您只能在pl / PgSQL(或其他pl / *)中执行此操作,但不能在纯SQL中执行此操作。

一个例外是WITH ()查询,它可以作为变量,甚至tuple的变量。 它允许您返回临时值表。

WITH master_user AS (

SELECT

login,

registration_date

FROM users

WHERE ...

)

SELECT *

FROM users

WHERE master_login = (SELECT login

FROM master_user)

AND (SELECT registration_date

FROM master_user) > ...;

J.Wincewicz answered 2019-05-09T12:33:48Z

53 votes

你也可以在PLPGSQL中试试这个:

DO $$

DECLARE myvar integer;

BEGIN

SELECT 5 INTO myvar;

DROP TABLE IF EXISTS tmp_table;

CREATE TABLE tmp_table AS

SELECT * FROM yourtable WHERE id = myvar;

END $$;

SELECT * FROM tmp_table;

以上要求Postgres 9.0或更高版本。

Dario Barrionuevo answered 2019-05-09T12:34:46Z

36 votes

这取决于您的客户。

但是,如果您使用的是psql客户端,则可以使用以下命令:

my_db=> \set myvar 5

my_db=> SELECT :myvar + 1 AS my_var_plus_1;

my_var_plus_1

---------------

6

Shahriar Aghajani answered 2019-05-09T12:35:18Z

34 votes

动态配置设置

你可以“滥用”动态配置设置:

-- choose some prefix that is unlikey to be used by postgres

set session my.vars.id = '1';

select *

from person

where id = current_setting('my.vars.id')::int;

配置设置始终是varchar值,因此在使用它们时需要将它们转换为正确的数据类型。 这适用于任何SQL客户端,而postgresql.conf仅适用于postgresql.conf

以上要求Postgres 9.2或更高版本。

对于以前的版本,变量必须在使用之前在postgresql.conf中声明,因此它在一定程度上限制了它的可用性。 实际上不是变量完全,但配置“类”本质上是前缀。 但是一旦定义了前缀,就可以使用任何变量而无需更改postgresql.conf

a_horse_with_no_name answered 2019-05-09T12:36:12Z

18 votes

使用pl / PgSQL之外的临时表

除了建议使用pl / pgsql或其他pl / *语言之外,这是我能想到的唯一其他可能性。

begin;

select 5::int as var into temp table myvar;

select *

from somewhere s, myvar v

where s.something = v.var;

commit;

Evan Carroll answered 2019-05-09T12:36:45Z

6 votes

我想提议对@ DarioBarrionuevo的答案进行改进,以便更简单地利用临时表。

DO $$

DECLARE myvar integer = 5;

BEGIN

CREATE TEMP TABLE tmp_table ON COMMIT DROP AS

-- put here your query with variables:

SELECT *

FROM yourtable

WHERE id = myvar;

END $$;

SELECT * FROM tmp_table;

bluish answered 2019-05-09T12:37:10Z

2 votes

以下是使用PREPARE语句的示例。 您仍然无法使用?,但您可以使用$n表示法:

PREPARE foo(integer) AS

SELECT *

FROM somewhere

WHERE something = $1;

EXECUTE foo(5);

DEALLOCATE foo;

Martin Zinovsky answered 2019-05-09T12:37:36Z

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值