postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量
sql - 如何在PostgreSQL查詢(xún)中聲明變量
如何聲明變量以用于PostgreSQL 8.3查詢(xún)?
在MS SQL Server中,我可以這樣做:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
我如何在PostgreSQL中做同樣的事情? 根據(jù)文檔變量被簡(jiǎn)單地聲明為“名稱(chēng)類(lèi)型;”,但這給了我一個(gè)語(yǔ)法錯(cuò)誤:
myvar INTEGER;
有人能給我一個(gè)正確語(yǔ)法的例子嗎?
8個(gè)解決方案
146 votes
我通過(guò)使用WITH條款完成了相同的目標(biāo),它沒(méi)有那么優(yōu)雅,但可以做同樣的事情。 雖然這個(gè)例子真的有點(diǎn)過(guò)分。 我也不特別推薦這個(gè)。
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中沒(méi)有這樣的功能。 您只能在pl / PgSQL(或其他pl / *)中執(zhí)行此操作,但不能在純SQL中執(zhí)行此操作。
一個(gè)例外是WITH ()查詢(xún),它可以作為變量,甚至tuple的變量。 它允許您返回臨時(shí)值表。
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中試試這個(gè):
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
這取決于您的客戶(hù)。
但是,如果您使用的是psql客戶(hù)端,則可以使用以下命令:
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
動(dòng)態(tài)配置設(shè)置
你可以“濫用”動(dòng)態(tài)配置設(shè)置:
-- 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;
配置設(shè)置始終是varchar值,因此在使用它們時(shí)需要將它們轉(zhuǎn)換為正確的數(shù)據(jù)類(lèi)型。 這適用于任何SQL客戶(hù)端,而postgresql.conf僅適用于postgresql.conf
以上要求Postgres 9.2或更高版本。
對(duì)于以前的版本,變量必須在使用之前在postgresql.conf中聲明,因此它在一定程度上限制了它的可用性。 實(shí)際上不是變量完全,但配置“類(lèi)”本質(zhì)上是前綴。 但是一旦定義了前綴,就可以使用任何變量而無(wú)需更改postgresql.conf
a_horse_with_no_name answered 2019-05-09T12:36:12Z
18 votes
使用pl / PgSQL之外的臨時(shí)表
除了建議使用pl / pgsql或其他pl / *語(yǔ)言之外,這是我能想到的唯一其他可能性。
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
我想提議對(duì)@ DarioBarrionuevo的答案進(jìn)行改進(jìn),以便更簡(jiǎn)單地利用臨時(shí)表。
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語(yǔ)句的示例。 您仍然無(wú)法使用?,但您可以使用$n表示法:
PREPARE foo(integer) AS
SELECT *
FROM somewhere
WHERE something = $1;
EXECUTE foo(5);
DEALLOCATE foo;
Martin Zinovsky answered 2019-05-09T12:37:36Z
總結(jié)
以上是生活随笔為你收集整理的postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: qt 加载 图片旋转_QT 实现图片旋转
- 下一篇: php提交raw_PHP中如何POST提