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

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

  1. c语言变量在头文件定义变量吗,在头文件C中声明变量

    参见英文答案 > What should go into an .h file?                                    12个 我正在尝试创建一个简单的程序,使用 ...

  2. 如何在MySQL中声明变量?

    本文翻译自:How to declare a variable in MySQL? How to declare a variable in mysql, so that my second quer ...

  3. PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)

    定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号. 在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: 1 2 3 4 5 6 7 8 &l ...

  4. python中声明变量注意事项_我们如何在Python中声明变量?

    简短的答案是,无需在Python中声明变量. 以下是更详细的描述. 静态类型语言(C,C ++,Java,C#)要求在程序中使用变量之前,必须先声明要使用的变量的名称和类型声明.相应的语言编译器确保将 ...

  5. 在循环之前或循环中声明变量之间的区别?

    本文翻译自:Difference between declaring variables before or in loop? I have always wondered if, in genera ...

  6. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  7. php mysql group by_php – 如何在mysql查询中解决“不在GROUP BY中”错误

    我有两个模型:帖子和喜欢有一对多的关系(所以,一个帖子有很多喜欢). Likings模型还有一个isActive字段,表示喜欢是主动还是被动. 我想获得(排序)前5个帖子,这些帖子已经收到了最大的&q ...

  8. react前端显示图片_如何在react项目中引用图片?

    如何在react项目中引用图片?本文码云笔记将为大家整理在react项目中插入图片以及背景图片的方法,希望对需要的小伙伴提供一些参考. 在react项目中插入图片以及背景图片的方法共有2种: 1.im ...

  9. t-sql 使用正则表达式_如何在T-SQL查询中使用可扩展表达式; 性能优势和实例

    t-sql 使用正则表达式 挑战 (The challenge) One of the main tasks of a SQL Server database administrator is per ...

最新文章

  1. leetcode算法题--多米诺与托米诺平铺★
  2. nmon服务器监控工具的使用安装
  3. Python中if条件判断语句的用法!
  4. golang 防知乎 中文验证码 源码
  5. mysql-nt.exe w3wp.exe cpu 100%_认识w3wp.exe进程,从根本上解决占用资源较大问题
  6. 2017西安交大ACM小学期数论 [阅兵式]
  7. 理论基础 —— 排序 —— 直接选择排序
  8. Summed-Area Variance Soft Shadow Mapping(SAVSM):二
  9. a good website to test OTP
  10. 如何把Java的double类型变量保留两位小数
  11. 三星Galaxy Note 20系列将首发Exynos 992:性能超骁龙865
  12. C++远征离港篇-学习笔记
  13. SPSS操作(五):主成分分析
  14. QQ、微信动态图表情包怎么制作?视频如何转GIF
  15. 英语系大一计算机课程有哪些,英语专业大一学习计划.docx
  16. word单元格调整文字行间距
  17. 测试用例 测试的方法
  18. 自学MBA,我推荐你看这本《MBA必读12篇》
  19. windows7自带摄像头拍照摄像软件
  20. 爬虫-招聘系列2----boss某直聘

热门文章

  1. EGOImageView 解析
  2. 在bash脚本中进行浮点运算
  3. 设计模式系列-组合模式
  4. CNN基础知识(2)
  5. commons-lang包中我们常用的类的作用
  6. oracle中if/else功能的实现的3种写法
  7. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
  8. javq接口_Java的接口及实例
  9. Python机器学习笔记:XgBoost算法(亲测)
  10. 全面剖析支付宝服务窗功能二次开发